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

Jes*_*ose 5 java javabeans drools-planner

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

@ValueRangeFromSolutionProperty假设指代属性从另一个类(NQueens在这种情况下).来自@ValueRangeFromSolutionPropertyJavaDocs:

propertyName

    The property name of which exists a getter on the Solution that returns a Collection. 
Run Code Online (Sandbox Code Playgroud)

但我注意到一个不一致的地方:注释器使用了rowList来自的属性NQueens.但是rowList(相反RowList)是一个私有变量(参见下面的片段).如果它应该通过内省推断出一个属性(来自它的getter和setter方法),那么它是不是应该拼写RowListgetRowList()

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

或者直接@ValueRangeFromSolutionProperty访问私有变量?


背景细节:From Queen.java,代表棋盘上的女王的类:

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

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;
...
Run Code Online (Sandbox Code Playgroud)

frm*_*frm 15

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);
 }
Run Code Online (Sandbox Code Playgroud)

所以:

  1. 如果name为null,则返回原样
  2. 如果前缀中name有前两个字符,请将其返回
  3. 所有其他字符串,decapitalize第一个字符