根据1997年的
JavaBeans API规范,应该如Thomas Einwaller所描述的那样:
public int getxIndex() { return xIndex; }
public void setxIndex(int xIndex) { this.xIndex = xIndex; }
很不幸,getx和setx都不是单词。在极少数情况下,如果这会形成一个单词或首字母缩略语,它会产生误导性,例如方法setiMessage
很可能与SETI无关。
使用代码质量的唯一有效衡量标准(每分钟WTFs),我评估这是糟糕的代码。
如果我们修改为遵循命名方法的惯例,那么它将是:
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规范的工具并不总是支持它,例如
Jackson 和
Swagger Code Generator 就已经被修补以符合它。即使 IntelliJ 根据 JavaBeans 规范生成访问器,文档中的
example 却与之不同。这可能是因为人们不知道该标准,自然更喜欢常规的方法命名约定。
那么何时应遵循 JavaBeans 规范呢?当属性名称应由依赖此标准的工具通过访问器推断时,我们可能需要使用它。例如,除非使用注释,否则
Jackson 将依赖于通过
getxIndex
和
setxIndex
方法访问属性
xIndex
。
什么情况下应避免使用此标准?按照我的建议:当代码应由人阅读和理解时。因为在命名方法时不使用正确的驼峰式大小写会误导信息。
如果按照我的方式,我们将使用常规命名约定,即
getXIndex
和
setXIndex
。但是,鉴于现实情况,我认为最好的解决方案是 @vaxquis 提出的建议:
将你的字段命名为"indexX"或其他名称,问题就解决了...不要过度复杂化事情 - 即使setxIndex是Beans的正确方式,但命名方法为setxIndex会增加代码的WTF因素,而不会给你带来任何回报。关于JavaBeans规范的任何评论都应按照规范本身的规定发送到java-beans@java.sun.com。{{}}
setxIndex
是Bean的正确方式,将方法命名为setxIndex
会增加代码的WTF因素而没有给你带来任何回报。如果你的司机生病了,请不要想着如何修理汽车,应该替换司机。 - user719662