【问题标题】:Confused about naming of JavaBean properties, with respect to getters and setters对 getter 和 setter 的 JavaBean 属性命名感到困惑
【发布时间】:2012-01-23 08:59:10
【问题描述】:

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

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

propertyName

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

但我注意到一个不一致:注释器使用来自NQueens 的属性rowList。但是rowList(相对于RowList)是一个私有变量(参见下面的sn-ps)。如果它应该通过自省推断属性(从它的 getter 和 setter 方法),不应该像 getRowList() 那样拼写为 RowList 吗?

问题: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;
...

【问题讨论】:

    标签: java javabeans drools-planner


    【解决方案1】:

    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 为空,则原样返回
    2. 如果name 的前两个字符大写,则原样返回
    3. 所有其他字符串,第一个字符不大写

    【讨论】:

    • 所以方法getURLRedirect() 提取到属性URLRedirectgetIRReciever()IRReciever(用于IR 接收器)、getFName()(和getfName())到fName?并且这样做是为了尊重名称约定“oneTwoThree”?
    • getFName 将对应于属性 FName。如果有两个大写字母,那么getter名称就是前面带“get”的属性名称。在所有其他情况下,属性的第一个字母大写。见link
    【解决方案2】:

    这是由 JavaBeans 命名约定定义的。 getter 名称将带有“get”,后跟属性名称,第一个字母大写。

    A related question with more information

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-03-18
        • 2018-08-15
        • 2023-03-10
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多