根据命名规范,返回布尔类的getter方法在Java中的名称是什么?

9
我注意到对于返回Boolean(而不是boolean)的getter,Netbeans会生成带有“get”前缀的getter。例如:
private Boolean main;

public Boolean getMain(){
  return this.main;
}

根据命名约定,这样做是否有误?或者“is”前缀只适用于基础类型?


2
这里没有对错之分。我认为 isMain 或 hasMain 或 supportsMain(取决于 main 的含义)更加描述性。我认为它是否为布尔值不应该有所区别。 - Eran
“get”和“is”都可以作为前缀,而“is”只是使其更容易发现它返回了“true”或“false”。但是,对于布尔值,它也可能返回null,所以也许这就是为什么选择“get”而不是“is”前缀的原因。 - Stultuske
2
“错误”是基于什么判断的? - Thomas
@iJava 如果您能澄清您是否指的是JavaBeans命名约定,那将会很有帮助 - 如果不是,那么您可以随意命名方法,这个问题就没有太多意义(或者至少主要基于个人观点)。如果是的话,那么答案就会更简单明了。 - CupawnTae
6个回答

6
Netbeans在这里并没有错 - 对于Boolean对象属性,get是正确的。一方面,属性值可能为null,在这种情况下,is就没有意义了。 JavaBeans规范允许类型为boolean时使用is作为特例,并且没有提到Boolean。假设这个特例适用于Boolean对象将是无效的。

这完全取决于情况。请注意,在这种情况下,main是私有的,这意味着可能存在类不变量来保证main永远不为null,或者空值在内部可能代表false。 - aioobe
我只是想说你的回答中有很多假设,并且你似乎在争辩哪一个是正确的,哪一个不是。 - aioobe
还有,最近试图回想情况 - 我认为是jax-ws的 wsimport - 为强制字段生成 booleanis,而对于可选字段则生成 Booleanget - CupawnTae

6
这里是来自实际 JavaBeans 规范文档 的一句话引用:
“8.3.2 布尔属性 此外,对于布尔属性,我们允许 getter 方法与模式匹配: public boolean is<PropertyName>(); 这个 is<PropertyName> 方法可以提供代替 get<PropertyName> 方法,或者除了 get<PropertyName> 方法之外还可以提供。无论哪种情况,如果一个布尔属性存在 is<PropertyName> 方法,那么我们将使用 is<PropertyName> 方法来读取属性值。”
请注意,这适用于 boolean 而不是 Boolean 值。还要注意,is 是 get 的允许替代方案,而 get 则始终是适当的。

1
如果这个问题不涉及JavaBeans命名规范,我认为它就没有什么分量了。这将成为一个“主观性强”的问题。 - Marko Topolnik
1
请记住,生成getter的主要目的是与内省库进行交互,这些库总是假定JavaBeans约定。 - Marko Topolnik
我不同意。我已经无数次使用了所选属性的getter/setter,但从未使用过JavaBeans。(为了这个讨论,我不得不查阅JavaBeans的详细信息。) - aioobe
“贫血领域模型”这个说法是一个相当不恰当的批评,原因如下:大多数业务功能并不仅与一个数据对象耦合:数据对象自然而然地不拥有那些逻辑片段。Java和大多数其他“面向对象编程”语言都是单分派的,这自然导致了代码和数据之间的分离。 - Marko Topolnik
1
此外,“贫血领域模型”与JavaBeans没有任何关系,因为JavaBeans只是一种将对象属性提升到与方法同等地位的Java特定约定。在大多数其他情况下,这已经集成到语言本身中:仅属性声明即可为对象提供实例变量和访问器方法。 - Marko Topolnik
显示剩余5条评论

1
这取决于包含该方法的类是否要被视为JavaBean。
如果您打算将其作为JavaBean,则Marko Topolnik的答案是准确的。
否则就没有对错之分。使用get还是is(或其他)取决于方法的合同和目的。Eran的第一个评论非常准确:
“这里没有对错之分。我认为isMain或hasMain或supportsMain(取决于main的含义)更具描述性。我不认为它应该区分boolean还是Boolean。”
您问惯例是什么,我会说惯例是尽可能命名方法具有描述性和语义准确性。
关于isget的详细说明:
  • 如果该方法旨在作为大写字母B的Boolean属性的一般访问器,可能会采用值null,则使用get更有意义。

  • 如果该方法旨在提供否则为内部(如此private)非空标志的状态,则我认为is将是一个适当的前缀。(尽管我可能会使用boolean作为返回值,除非有一个常见的用例,例如执行isMain().hashCode()或类似操作。)


0

Boolean 对象上,您可以应用许多方法: toStringequalsvalueOf..

对于您的问题,没有完整的答案,这真的取决于使用情况和调用方法的人。有以下几点是有意义的:

public boolean isMain(){
    return this.main.booleanValue();
}

但是,如果你的逻辑不能保证main可以有null值,那么get是一个好的前缀。


0

这是正确的。Boolean 是原始数据类型 boolean 的包装类,因此 Boolean 将返回对象。同样的 get 也用于对象,就像原始数据类型一样。


0
根据OCP Oracle Certified Professional Java SE 8程序员II学习指南书:
以下哪些内容可以正确地包含在JavaBean中?
public boolean isPlaying() { return playing; }
public boolean getPlaying() { return playing; }
public Boolean isDancing() { return dancing; }

第一行是正确的,因为它为布尔变量定义了一个适当的getter方法。 第二个例子也是正确的,因为布尔类型可以使用is或get。

第三行是不正确的,因为Boolean包装器应该以get开头,因为它是一个对象。


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