当前位置: 首页 > 面试题库 >

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

楮法
2023-03-14
问题内容

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

@ValueRangeFromSolutionProperty假设指代属性从另一个类(NQueens在这种情况下)。从JavaDocs中获取@ValueRangeFromSolutionProperty:

propertyName

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

但我注意到一个 矛盾
:在注释使用属性rowListNQueens。但是rowList(与相对RowList)是一个私有变量(请参见下面的代码段)。如果应该
通过自省 (通过它的getter和setter方法) 推断属性, 则是否应将其拼写RowListgetRowList()

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

问题答案:

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


 类似资料:
  • 有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get

  • 我不明白为什么我必须对类中的私有属性使用getter或setter。

  • 如何在Kotlin中创建一个具有私有getter(或只是没有)但具有公共setter的属性? 不能使用错误: 在我的例子中,原因是Java Interop:我希望我的Java代码能够调用,但不能调用。

  • 问题内容: 如果我有以下私人成员: 我应该如何命名我的吸气剂/设置剂: 要么 编辑:或 ? 问题答案: 正确答案是 如果希望根据 8.8 节 : 将JavaBeans API规范 的推断名称大写 (例如,通过JSP中的$ {object.xIndex}访问它们),将它们用作属性。

  • 问题内容: 如果我的Java类中有一个属性’gId’,该accessor方法应命名为什么? 这就是我的假设。 如果有一个属性,我认为应该是,这种外观很难看(尽管这并不是指女孩的另一种拼写)。 如果该属性只是方法名称,那么我不会首先将该属性命名为URL,这会使访问器再次变得丑陋- 我记得在Javabean Specification PDF的某处读到了有关属性的大写以及涉及首字母缩略词的案例,但现在

  • 问题内容: 如何在JavaScript中模拟PHP风格的__get()和__set()魔术获取器/设置器?许多人说这目前是不可能的。我几乎可以肯定,这是有可能的,因为像nowjs(http://nowjs.com)这样的项目会做这样的事情。 我知道您可以利用get和set,但是当您不确定属性名称是什么时,这些将无法使用。例如, 如果您希望在创建新属性时执行事件处理程序,该 怎么办? 我想做的例子: