对getter和setter的JavaBean属性命名感到困惑

时间:2012-01-23 08:59:10

标签: java javabeans drools-planner

我正在制作一个使用Drools计划器的应用程序。

@ValueRangeFromSolutionProperty应该引用另一个类的属性(在这种情况下为NQueens)。来自JavaDocs for @ValueRangeFromSolutionProperty

propertyName

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

但我注意到不一致:注释器使用rowList中的属性NQueens。但是rowList(而不是RowList)是一个私有变量(请参阅下面的代码段)。如果它应该通过内省来推断属性(来自它的getter和setter方法),那么它是不是像RowList那样拼写为getRowList()

问题: Java如何从getter方法推断(内省)属性名称(case和all)?

或者@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 个答案:

答案 0 :(得分:14)

JavaBeans Specification表示对于属性propertyName,应该有一个getter方法getPropertyName()和/或一个setter方法setPropertyName()

属性由getter和setter方法的唯一存在定义,也可以是计算值。不需要对象上的实例变量。

规范定义了属性和getter / setter方法的大小写规则:

  

因此,当我们从中间提取属性或事件名称时   现有的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为null,则返回
  2. 如果name的前两个字符有大写字母,请按原样返回
  3. 所有其他字符串,首先使用第一个字符

答案 1 :(得分:3)

这是由JavaBeans命名约定定义的。 getter名称将包含“get”,后跟属性名称,首字母大写。

A related question with more information

答案 2 :(得分:0)

当javabeans引用“属性”时,它是带有get()和set()方法的东西。它并不关心数据的内部存储是什么(如果有的话)。

因此,属性“foo”具有访问方法getFoo()和setFoo(),这些方法的作用与属性的定义无关。

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