JavaBeans中布尔类型的getter方法的有效命名规则

68
我知道大多数变量名会用"is"作为前缀,例如isBlue(),但是像hasProperty()这样使用"has"作为前缀是否也是有效的?

1
我已经移除了主观标签,因为我认为这不合适(原因已经说明)。如果原作者能够明确需要什么,如果他并不真的追求JavaBeans命名约定的严格有效性,我们可以把它放回去。 - Jon Skeet
3个回答

86
根据JavaBeans规范第8.3.2节:
布尔属性
此外,对于布尔属性,我们允许getter方法匹配模式:public boolean is<PropertyName>();。这个"isPropertyName"方法可以代替一个"get<PropertyName>"方法提供,或者除了一个"get<PropertyName>"方法之外还可以提供。在任何一种情况下,如果is<PropertyName>方法对于布尔属性存在,则我们将使用"is<PropertyName>"方法读取属性值。一个布尔属性的例子可能是: public boolean isMarsupial(); public void setMarsupial(boolean m);
换句话说,除非有什么改变,否则很抱歉,has不是有效的前缀。
一些工具和库可能仍然会识别这样的属性,但依赖它并不是一个好主意。

1
这个回答非常合理,但我认为问题需要重新表述一下,以明确提到该问题是特定于JavaBeans规范的。仅凭标签无法很好地传达这些信息,而根据问题本身,“has”将是一个完全可以接受的前缀。 - Ryan Guill
1
主题行在我看来相当明确 - 他询问变量名是否“有效”表明这里涉及的不仅仅是个人偏好。 - Jon Skeet
1
为了与其他属性类型保持一致,同时仍然保留有意义的名称,我更喜欢使用例如 hasParent 和 getHasParent() 作为字段和属性名称,根据引用规范来看,这仍然是完全有效的。命名布尔值 getter 为 "isX()" 并不总是语义上合适的,我宁愿使用冗长的代码而不是误导性/混淆性的代码。 - Joe Lee-Moyet
@JonSkeet:这个命名比 isHasCar 听起来更奇怪吗(我不是以英语为母语的说)?在这种情况下,你的选择会是什么? - msa
@msa:说实话,我不会使用这两个选项。(除非我需要遵循Javabeans约定。) - Jon Skeet
显示剩余9条评论

10

据规范,Jon Skeet指出此方法无效。同时,canXshouldX等也是无效的。这真是令人遗憾。以下是一种检查给定属性是否具有有效getter的方法:

BeanInfo info = Introspector.getBeanInfo(Item.class);

for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
    System.out.println(pd.getName() + " : " + pd.getReadMethod());
}

Item应该是一个JavaBean,具有一个名为foo的属性和一个getter。如果read方法为null,则意味着根据JavaBeans规范未定义有效的getter。


4
这有点主观,但是我认为“has”是一个布尔属性的完全有效的前缀。
编辑:问题本身没有提到JavaBeans规范,因此我的答案没有涉及该方面。

9
不是主观的,而是由JavaBeans规范确定的。 - Jon Skeet
1
然而他在问题中并没有提到他正在寻找一个适用于JavaBeans规范的答案。 - Ryan Guill
7
“valid java beans names”在主题中不是一个相当明显的提示吗? - Jon Skeet
4
@Ryan - "Jon Skeet" 之所以是他,而我们不是,是有原因的 :-) - Jose Basilio
2
是的,我认为仅凭这个事实就足以让每个人都同意他的观点。我对这个问题感到困惑,因为它不够清晰,我认为没有理由不编辑问题以提高其清晰度。哦,好吧。 - Ryan Guill
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接