题 布尔getter方法的有效JavaBeans名称


我知道大多数变量名称都适用于“是”,例如 isBlue(),但是“has”也是一个有效的前缀,就像 hasProperty()


52
2018-04-28 18:30


起源


我已经删除了主观标记,因为我认为它不合适(出于我所概述的原因)。如果原作者可以准确地澄清所需要的内容,那么如果事实证明他并非真正遵循JavaBeans命名约定的严格有效性,我们可以将其重新放入。 - Jon Skeet


答案:


根据 JavaBeans规范 第8.3.2节:

布尔属性
  另外,为   布尔属性,我们允许一个getter   匹配模式的方法:

public boolean is<PropertyName>();

  这个   “isPropertyName“方法可能是   提供而不是   “get<PropertyName>“方法,或者可能   除了a之外还提供   “get<PropertyName>“方法。在任何一个   如果是的话 is<PropertyName> 方法   然后出现一个布尔属性   我们会用“is<PropertyName>“   读取属性值的方法。一个   示例布尔属性可能是:

     public boolean isMarsupial();   public void setMarsupial(boolean m);

换句话说,除非事情发生变化,否则 has 不是我害怕的有效前缀:(

有可能 一些 工具和库无论如何都会识别这些属性,但依赖它并不是一个好主意。


64
2018-04-28 18:37



这个答案很有道理,但我想说这个问题需要改写,提到这个问题是针对javabeans规范的。标签本身并不能很好地传达这些信息,一般来说,根据问题本身,“has”将是一个完全可以接受的前缀。 - Ryan Guill
主题行使IMO相当清楚 - 而且他询问变量名称是否“有效”这一事实表明这里不仅仅涉及个人偏好。 - Jon Skeet
为了与其他属性类型保持一致,同时仍然保留有意义的名称hasParent和getHasParent()分别作为字段和属性名称,查看引用的规范仍然完全有效。命名一个布尔getter“isX()”并不总是在语义上合适,我更喜欢冗长的代码而不是误导/混淆代码。 - yjo
@yjo:我会用的 isChild 在这种情况下 :) getHasParent对我来说感觉真的很难看 - 它并没有违反规范,但它确实感觉不对。 - Jon Skeet
@ParthVishvajit:你可以试试 getIsParent()... - Jon Skeet


Jon Skeet指出,根据规范它是无效的。也, canXshouldX,喜欢无效。这是相当不幸的。这是一种检查给定属性是否具有有效getter的方法:

BeanInfo info = Introspector.getBeanInfo(Item.class);
Item itm = new Item();
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
    System.out.println(pd.getName() + " : " + pd.getReadMethod());
}

班上 Item 应该是一个带有foo属性的javabean和一个getter。如果是read方法 null,这意味着根据javabeans规范没有定义有效的getter。


9
2017-12-25 18:40





这有点主观,但是,我会说“has”是布尔属性的完全有效前缀。

编辑 正如所提出的那样,问题没有提到javabeans规范,因此我的答案没有涉及问题的这一方面。因此上面的答案。


4
2018-04-28 18:32



它不是主观的 - 它由JavaBeans规范决定。 - Jon Skeet
然而他没有在他的问题中提到他正在寻找一个适用于javabeans规范的答案。 - Ryan Guill
在这个主题中“有效的java bean名称”是不是很大的线索? - Jon Skeet
@Ryan - 有一个原因,他是“Jon Skeet”而我们不是:-) - Jose Basilio
是的,我怀疑只有这个事实足以让每个人都同意他的看法。我对这个问题很困惑,因为它不清楚,并且没有理由不为了清晰而编辑问题。好吧。 - Ryan Guill