Java中getter/setter的命名约定

Sim*_*mon 32 java naming-conventions javabeans getter-setter

如果我有以下私人会员:

private int xIndex;
Run Code Online (Sandbox Code Playgroud)

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

getXindex()
setXindex(int value)
Run Code Online (Sandbox Code Playgroud)

要么

getxIndex()
setxIndex(int value)
Run Code Online (Sandbox Code Playgroud)

编辑:或

getXIndex()
setXIndex(int value);
Run Code Online (Sandbox Code Playgroud)

Tho*_*ler 33

正确的答案是

getxIndex()
setxIndex(int value)
Run Code Online (Sandbox Code Playgroud)

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

  • 我写了一篇关于它的博客文章:http://dertompson.com/2013/04/29/java-bean-getterssetters/ (6认同)
  • 我不认为这是正确的.第8.8节涉及从方法名称推断出的属性名称的大小写.这个问题是询问基于属性名称命名方法的相反过程.Inspector.decapitalize()的javadoc声明它是一个"获取字符串并将其转换为普通Java**变量名**的方法",而不是本例中的方法名称. (2认同)

Lov*_*ove 7

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

private int xIndex;
public int getxIndex() { return xIndex; }
public void setxIndex(int xIndex) { this.xIndex = xIndex; }
Run Code Online (Sandbox Code Playgroud)

这很不幸,getxsetx都不是单词,因为IntelliJ生成的代码也很少被IntelliJ警告.因此,虽然这符合JavaBeans规范,但它违反了命名方法的约定 .在罕见的情况下,这将形成一个单词或首字母缩略词,它将是消息性的,例如,该方法setiMessage很可能与SETI无关.使用唯一有效的代码质量测量值(每分钟WTF),我评估这是错误的代码.

这一切都归结为JavaBeans规范的这句话:

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

究竟是什么样的使用所指的所有大写名称对我来说都不清楚.根据惯例,字段名称应该 是驼峰式的.在我看来,我们生成非常规的方法名称,以支持20世纪20年前的文件所决定的非常规字段名称.

还应该注意的是,尽管它似乎是对工具中JavaBeans规范的压倒性支持,但并不是专门使用它.例如.xIndex在上面的例子中,Kotlin不承认属性.相反,Kotlin属性var xIndex = 0将导致Java方法getXIndexsetXIndex.根据JetBrains的支持,这似乎是一个错误,但我没有看到如何在不做出突破性改变的情况下修复它.

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

那么我们何时应该遵循JavaBeans规范?当属性名称应由访问者通过依赖此标准的工具推断时,我们可能希望使用它.例如,杰克逊将依赖于xIndex通过getxIndexsetxIndex方法访问的财产,除非我们使用注释.

什么时候应该避免这个标准?根据我的建议:当人们阅读和理解代码时.因为在命名方法是消息时不使用适当的驼峰套管.

如果我按照自己的方式使用它,我们将使用正常的命名约定,即getXIndexsetXIndex.但是,鉴于事态,我看到的最佳解决方案是由@vaxquis提出的:

将你的字段命名为"indexX"或其他任何东西,你的问题就解决了......不要过于复杂化 - 即使setxIndex是Beans的正确方法,使用名为setxIndex的方法会增加代码的WTF因子,而不会给你任何回报.

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


小智 5

应该:

getXIndex()
setXIndex(final int xIndex)
Run Code Online (Sandbox Code Playgroud)

  • 不正确,那些 getter 不符合 Java Bean 命名约定 (8认同)
  • 这个答案不正确,来自@ThomasEinwaller 的答案是,因为这是明确规定的,而不是我们需要争论的问题:) (4认同)
  • 如果这是正确的答案,为什么 IDE(已测试 Intellij,也阅读 Eclipse)会生成其他内容?它们生成 getxIndex() 和 setxIndex()。有人可以澄清吗? (2认同)