Confus au sujet de la dénomination des propriétés JavaBean, par rapport aux getters et setters


Je fais une application qui utilise Bave planner.

Le @ValueRangeFromSolutionProperty est censé faire référence à une propriété d'une autre classe (NQueens dans ce cas). À partir de la Javadoc @ValueRangeFromSolutionProperty:

propertyName

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

Mais j'ai remarqué une incohérence : l'annotateur utilise la propriété rowList de NQueens. Mais rowList (par opposition à RowList) est une variable privée (voir les extraits ci-dessous). S'il était censé déduire une propriété par introspection (à partir de ses méthodes getter et setter), ne devrait-il pas être orthographié RowList comme dans getRowList()?

Question: Comment Java déduire (introspection) le nom de la propriété (et toutes) de l'méthodes de lecture?

Ou le @ValueRangeFromSolutionProperty accède-t-il directement aux variables privées ?


Détails de fond: De Queen.java, une classe qui représente une reine sur un échiquier:

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

De NQueens.java, la classe à partir de laquelle le @ValueRangeFromSolutionProperty obtient sa propriété de:

public class NQueens extends AbstractPersistable implements Solution<SimpleScore> {
...
private List<Column> columnList;
private List<Row> rowList;
....
public List<Row> getRowList() {
    return rowList;
...
Author: aitchnyu, 2012-01-23

3 answers

Le JavaBeans Spécification dit que pour une propriété propertyName il devrait y avoir une méthode de lecture getPropertyName() et/ou une méthode de définition setPropertyName().

Une propriété est définie par la seule présence des méthodes getter et setter et peut également être une valeur calculée. Une variable d'instance sur l'objet n'est pas requise.

La spécification définit les règles de majuscule pour les propriétés et les méthodes getter/setter:

Ainsi, lorsque nous extrayons un nom de propriété ou d'événement du milieu d'une nom Java existant, nous convertissons normalement le premier caractère en inférieur cas. Cependant, pour prendre en charge l'utilisation occasionnelle de tous les noms en majuscules, nous vérifions si les deux premiers caractères du nom sont tous deux majuscules et si donc le laisser seul. Ainsi, par exemple,

"FooBah" devient "fooBah", "Z" devient "z", "URL" devient "URL


La méthode est en fait implémentée comme:

/*
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);
 }

Donc:

  1. si le name est nulle, le retourner comme tel
  2. si le name a deux premiers caractères en majuscules, renvoyez-le comme tel
  3. toutes les autres chaînes, décapitaliser le premier caractère
 14
Author: frm, 2012-01-23 12:40:29

Qui est défini par les conventions de nommage JavaBeans. Le nom du getter aura " get " suivi du nom de la propriété avec la première lettre en majuscule.

Une question connexe, avec plus d'informations

 3
Author: Vadim, 2017-05-23 12:24:53

Lorsque javabeans fait référence à une "propriété", c'est quelque chose avec une get() et une set()-méthode. Il ne se soucie pas de ce qu'est le stockage interne des données (s'il y en a même un).

Ainsi, une propriété "foo" a des méthodes d'accès getFoo() et setFoo (), ce que font ces méthodes n'est pas pertinent pour la définition de la propriété.

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

 0
Author: Rolf Rander, 2012-01-23 09:07:56