Java 中 getters/setters 的命名约定

如果我有以下私人会员:

private int xIndex;

我应该如何命名我的 getter/setter:

getXindex()
setXindex(int value)

getxIndex()
setxIndex(int value)

编辑:或

getXIndex()
setXIndex(int value);

?


答案 1

正确答案是

getxIndex()
setxIndex(int value)

如果您希望根据第 8.8 节将它们用作属性:JavaBeans API 规范的推断名称的大写(例如,通过 JSP 中的 ${object.xIndex} 访问它们。


答案 2

根据1997年的JavaBeans API规范,它应该像Thomas Einwaller所描述的那样:

// According to JavaBeans API specification
public int getxIndex() { return xIndex; }
public void setxIndex(int xIndex) { this.xIndex = xIndex; }

这很不幸,getxsetx不是单词。在极少数情况下,当这会形成一个单词或首字母缩略词时,它将是虚假信息,例如,该方法很可能与SETI无关。使用代码质量的唯一有效测量(每分钟的WTF数),我评估这是糟糕的代码setiMessage

如果我们修改它以遵循命名方法的约定,它将是:

// According to Java naming convention
public int getXIndex() { return xIndex; }
public void setXIndex(int xIndex) { this.xIndex = xIndex; }

为什么 JavaBeans 规范违反了约定?这一切都归结于JavaBeans规范的这句话:

但是,为了支持偶尔使用所有大写名称,我们检查名称的前两个字符是否都是大写的,如果是这样,则不要使用它。

我不清楚这到底是用什么方式来称呼所有大写名称。按照惯例,字段名称应采用驼峰大小写。在我看来,我们生成非常规方法名称是为了支持由一个 20 多年前的文档决定的非常规字段名称。

还应该注意的是,尽管它似乎是对工具中JavaBeans规范的压倒性支持,但它并不是专门使用的。例如。在上面的示例中,Kotlin 不会识别为属性。相反,Kotlin 属性将生成 Java 方法和 。根据JetBrains的支持,这似乎是一个错误,但我不明白他们如何在不进行重大更改的情况下解决此问题。xIndexvar xIndex = 0getXIndexsetXIndex

一些支持JavaBeans规范的工具并不总是这样做,例如JacksonSwagger Code Generator已经打补丁以符合它。尽管 IntelliJ 根据 JavaBeans 规范生成访问器,但文档中的示例与它不同。可能是因为人们不了解标准,自然更喜欢正常方法命名约定。

那么我们什么时候应该遵循JavaBeans规范呢?当访问器应该通过依赖于此标准的工具推断属性名称时,我们可能希望使用它。例如,Jackson 将依赖于通过访问的属性和方法,除非我们使用注释。xIndexgetxIndexsetxIndex

我们什么时候应该避免这个标准?根据我的建议:何时应该由人类阅读和理解代码。因为在命名方法时不使用正确的骆驼外壳是没有信息的。

如果我愿意按照自己的方式,我们将使用正常的命名约定,即和.但是,鉴于事情的现状,我看到的最佳解决方案是由@vaxquis建议的:getXIndexsetXIndex

将您的字段命名为“indexX”或其他任何内容,您的问题就解决了...不要把事情过于复杂 - 即使 setxIndex 是 Beans 的正确方法,使用名为 setxIndex 的方法会增加代码的 WTF 因子,而不会给你任何回报。

根据规范本身,有关 JavaBeans 规范的任何注释都应发送给 java-beans@java.sun.com。