Java中getter/setter的命名约定

Java中getter/setter的命名约定,java,naming-conventions,javabeans,getter-setter,Java,Naming Conventions,Javabeans,Getter Setter,如果我有以下私人会员: private int xIndex; 我应该如何命名我的getter/setter: getXindex() setXindex(int value) 或 编辑:或 getXIndex() setXIndex(int value); ?应该是: getXIndex() setXIndex(final int xIndex) 我认为getXindex()是最好的方法。getter应该以“get”开头,后跟成员名,首字母大写。还有我听说的最新惯例,说我们应该避免一个

如果我有以下私人会员:

private int xIndex;
我应该如何命名我的getter/setter:

getXindex()
setXindex(int value)

编辑:或

getXIndex()
setXIndex(int value);

应该是:

getXIndex()
setXIndex(final int xIndex)

我认为
getXindex()
是最好的方法。getter应该以“get”开头,后跟成员名,首字母大写。还有我听说的最新惯例,说我们应该避免一个接一个地使用多个大写字母。例如,
getHTMLtooltip
是错误的。它应该是
getHtmlTooltip
。此外,您应该尝试将所有成员设置为final,并且不需要设置器,因为类是不可变的;)

方法应该是动词,混合大小写,第一个字母小写,每个内部单词的第一个字母大写

正确答案是

getxIndex()
setxIndex(int value)

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

您应该使用包java.beans中的Introspector.decapitalize,因为它符合java规则,所以您没有问题。

Eclipse ide自动生成setter和getter,如下所示:

getxIndex()
setxIndex(int value)
它符合java beans API规范。

符合 正如Thomas Einwaller所描述的:

// According to JavaBeans API specification
public int getxIndex() { return xIndex; }
public void setxIndex(int xIndex) { this.xIndex = xIndex; }
不幸的是,getx和setx不是单词。在极少数情况下,当这会形成一个单词或首字母缩略词时,它会造成信息失真,例如方法
setiMessage
most 可能与此无关。 使用(每分钟WTF), 我认为这是错误的代码

如果我们修改这一点以遵循 它将是:

// According to Java naming convention
public int getXIndex() { return xIndex; }
public void setXIndex(int xIndex) { this.xIndex = xIndex; }
为什么JavaBeans规范违反了约定?归结起来就是JavaBeans规范的这句话:

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

我不清楚所有大写名称的确切用法。根据 ,被骆驼套上。看起来 对我来说,我们生成非常规方法名是为了支持由 有20多年历史的文件

还应该注意的是,尽管它似乎是对工具中JavaBeans规范的压倒性支持, 它不是专门使用的。例如,Kotlin在上述示例中不会将
xIndex
识别为属性。相反 Kotlin属性
var xIndex=0
将导致Java方法
getXIndex
setXIndex
。这似乎是一个错误 根据JetBrains的支持,但我看不出他们如何在不做出破坏性改变的情况下解决这个问题

一些支持JavaBeans规范的工具并不总是这样做,例如 并进行了修补以符合其要求。 尽管IntelliJ根据JavaBeans规范生成访问器,但是 文档中的内容与此不同。可能是因为人们不了解标准,自然更喜欢 常规方法命名约定

那么我们什么时候应该遵循JavaBeans规范呢?什么时候应该由访问器通过 依赖这个标准,我们可能会想使用它。例如,将依赖 通过
getxIndex
setxIndex
方法访问的属性
xIndex
,除非我们使用注释

我们什么时候应该避免这个标准?根据我的建议:代码什么时候应该被人类阅读和理解。 因为在命名方法不具信息性时不使用适当的驼峰大小写

如果按照我的方式,我们将使用正常的命名约定,即
getXIndex
setXIndex
当然,我看到的最好的解决方案是@vaxquis:

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

根据规范本身,任何关于JavaBeans规范的评论都应该发送到
爪哇-beans@java.sun.com.

@m_pGladiator:re immutable:虽然这显然是可取的,但并不是所有类都可以变为不可变的。当然,setter应该只在需要时出现。@Simon:主要原因是线程安全。如果一个类是不可变的,那么通过单独的线程进行并发修改就不会出现问题,我没有阅读“javabeans”标签。beans体系结构假定getter和setter,不支持immutabilityDownvote,因为问题中提到的情况在规范中指定,请参阅其他答案。如果这是正确答案,为什么IDE(tested Intellij,read Eclipse)生成其他东西?它们生成getxIndex()和setxIndex()。有人能澄清一下吗?不正确,这些getter不符合Java Bean命名约定。这个答案不正确,@ThomasEinwaller的答案是,因为这是明确规定的,我们不需要争论:)我写了一篇博客文章:我认为这不正确。第8.8节涉及从方法名称推断的属性名称的大小写。这个问题询问的是基于属性名命名方法的反向过程。javadoc for Inspector.decapitalize()声明它是一个“获取字符串并将其转换为普通Java变量名的方法”,而不是本例中的方法名。@SotiriosDelimanolis您引用的规范中的句子大约是大写。因此,它不应该在这里应用。您必须考虑“另一种方式”:如果您要使getter getXIndex成为decapitalize方法,那么decapitalize方法将查看XIndex并确定没有任何东西需要去资本化——因此它返回XInde
// According to Java naming convention
public int getXIndex() { return xIndex; }
public void setXIndex(int xIndex) { this.xIndex = xIndex; }