Не знаете, как назвать свойства JavaBean по отношению к геттерам и сеттерам.

Я делаю приложение, которое использует планировщик Drools.

@ValueRangeFromSolutionProperty должен ссылаться на свойство из другого класса (в данном случае NQueens). Из JavaDocs для @ValueRangeFromSolutionProperty:

propertyName

    The property name of which exists a getter on the Solution that returns a Collection. 

Но я заметил несоответствие: аннотатор использует свойство rowList из NQueens. Но rowList (в отличие от RowList) является частной переменной (см. Фрагменты ниже). Если предполагалось, что он выводит свойство путем интроспекции (с помощью методов получения и установки), не следует ли его писать RowList, как в getRowList()?

Вопрос: Как Java определяет (анализирует) имя свойства (регистр и все) из методов получения?

Или @ValueRangeFromSolutionProperty обращается к частным переменным напрямую?


Предыстория: из Queen.java, класс, представляющий ферзя на шахматной доске:

public class Queen extends AbstractPersistable {
....
@ValueRangeFromSolutionProperty(propertyName = "rowList")
public Row getRow() {
    return row;
....

Из NQueens.java, класс, из которого @ValueRangeFromSolutionProperty получает свойство:

public class NQueens extends AbstractPersistable implements Solution<SimpleScore> {
...
private List<Column> columnList;
private List<Row> rowList;
....
public List<Row> getRowList() {
    return rowList;
...

person Jesvin Jose    schedule 23.01.2012    source источник


Ответы (3)


В спецификации JavaBeans говорится, что для свойства propertyName должно быть методом получения getPropertyName() и / или методом установки setPropertyName().

Свойство определяется только наличием методов получения и установки и также может быть вычисленным значением. Переменная экземпляра объекта не требуется.

Спецификация определяет правила использования заглавных букв для свойств и методов получения / установки:

Таким образом, когда мы извлекаем имя свойства или события из середины существующего имени Java, мы обычно преобразуем первый символ в нижний регистр. Однако для поддержки случайного использования всех имен в верхнем регистре мы проверяем, являются ли первые два символа имени обоими прописными буквами, и если да, то оставим это в покое. Так, например,

«FooBah» становится «fooBah», «Z» становится «z», «URL» становится «URL».


Фактически метод реализован как:

/*
Utility method to take a string and convert it to normal Java variable name 
capitalization. This normally means converting the first character from upper case to  
lower case, but in the (unusual) special case when there is more than one character  
and both the first and second characters are upper case, we leave it alone.

Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays as "URL".

 Parameters:
     name The string to be decapitalized.
 Returns:
 The decapitalized version of the string.
 */
 public static String  decapitalize(String name) {
 if (name == null || name.length() == 0) {
 return name;
 }
 if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                     Character.isUpperCase(name.charAt(0))){
        return name;
     }

     char chars[] = name.toCharArray();
     chars[0] = Character.toLowerCase(chars[0]);
     return new String(chars);
 }

So:

  1. если name имеет значение null, вернуть его как таковое
  2. если name имеет первые два символа в заглавных буквах, вернуть его как таковой
  3. все остальные строки, декапитализировать первый символ
person frm    schedule 23.01.2012
comment
Итак, метод getURLRedirect() извлекает свойство URLRedirect, getIRReciever() в IRReciever (для ИК-приемника), getFName () (и getfName ()) в fName? И это сделано, чтобы уважать соглашение об именах oneTwoThree? - person Jesvin Jose; 23.01.2012
comment
getFName будет соответствовать свойству FName. Если есть две буквы в верхнем регистре, то имя получателя - это имя свойства с get впереди. Во всех остальных случаях первая буква свойства пишется с заглавной буквы. См. Ссылку . - person Vadim; 23.01.2012

Это определено соглашениями об именах JavaBeans. В имени получателя будет слово «get», за которым следует имя свойства с первой буквой с заглавной буквы.

Связанный вопрос с дополнительной информацией

person Vadim    schedule 23.01.2012

Когда javabeans ссылаются на «свойство», это что-то с методами get () и set (). Его не волнует, что такое внутреннее хранилище данных (если оно вообще есть).

Таким образом, свойство "foo" имеет методы доступа getFoo () и setFoo (), то, что делают эти методы, не имеет отношения к определению свойства.

http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html

person Rolf Rander    schedule 23.01.2012