Запутался в именовании свойств JavaBean по отношению к получателям и установщикам - PullRequest
4 голосов
/ 23 января 2012

Я делаю приложение, которое использует планировщик 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 выводит (анализирует) имя свойства (case и все) из методов получения?

Или @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;
...

Ответы [ 3 ]

14 голосов
/ 23 января 2012

Спецификация 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);
 }

Итак:

  1. , если name равно нулю, вернуть его таким образом
  2. , если name содержит первые два символа вcaps, верните его как таковое
  3. все остальные строки, декапитализируйте первый символ
3 голосов
/ 23 января 2012

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

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

0 голосов
/ 23 января 2012

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

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

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

...