关于JavaBean属性的命名,与getter和setter有关,有些困惑。

5
我正在制作一个使用Drools planner的应用程序。
@ValueRangeFromSolutionProperty 应该引用另一个类(在本例中为NQueens)中的属性。根据 @ValueRangeFromSolutionProperty 的JavaDocs 说明:
propertyName

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

但我注意到一个不一致之处:标注器使用了来自NQueens的属性rowList。但是,rowList(与RowList相反)是一个私有变量(请参见下面的片段)。如果它应该通过内省推断属性(从其getter和setter方法),那么它不应该拼写为RowList,如getRowList()中所示吗?
问题:Java如何从getter方法中推断(内省)属性名称(大小写等)?
或者@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个回答

16

JavaBeans规范指出,对于属性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,则返回null
  2. 如果name的前两个字符大写,则返回原样
  3. 对于所有其他字符串,将首字母小写。

1
那么,方法 getURLRedirect() 提取到属性 URLRedirectgetIRReciever() 提取到 IRReciever(用于红外接收器),getFName()(和 getfName())提取到 fName?这样做是为了遵守命名约定“oneTwoThree”吗? - Jesvin Jose
1
getFName将对应于属性FName。如果有两个大写字母,则getter名称是在属性名称前加上“get”的属性名称。在所有其他情况下,属性的第一个字母大写。请参见[链接](http://docs.oracle.com/javase/6/docs/api/java/beans/Introspector.html#decapitalize%28java.lang.String%29)。 - Vadim

3

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接