Java方法返回布尔值的命名约定

117

我喜欢在其他语言中使用方法或函数名末尾的问号。Java不允许我这样做。作为解决办法,在Java中如何命名返回布尔值的方法?在方法前使用ishasshouldcan 对于一些情况听起来还可以。是否有更好的方法来命名这样的方法?

例如:createFreshSnapshot?


3
哪种语言允许在方法名中使用 ? - SLaks
12
@SLaks,Scheme,Ruby... - Skilldrick
在Scheme中,我们总是在方法名的末尾加上一个p - Erick Robertson
@Erick:并不总是,但“p”是指定谓词的一种标准方式。 - Jason S
我们 = 我的本科计划班级总是这样做的。我在Java中绝对不会使用这种约定。 - Erick Robertson
7个回答

150

惯例是用名称提出问题。

以下是可以在JDK中找到的几个例子:

isEmpty()

hasChildren()

这样一来,变量名就像在末尾有一个问号。

集合是否为空?
此节点是否有子节点?

那么,true 意味着 "是",false 意味着 "否"。

或者,您可以将其视为断言:

集合为空。
节点有子节点。

注意:
有时您可能希望将方法命名为类似 createFreshSnapshot? 的名称。没有问号,则该名称意味着该方法应创建快照,而不是检查是否需要快照。

在这种情况下,您应该重新考虑自己的问题。例如 isSnapshotExpired 是更好的名称,并传达了调用方法时该方法将向您提供的信息。遵循此模式还可以帮助保持更多函数纯净,无副作用。

如果您在 Java API 中进行 Google搜索 来查找 isEmpty(),则会得到大量结果。


创建新的快照怎么样? - letronje
4
根据你的标准,我会把它重命名为“isSnapshotExpired”或类似的名称。 - jjnguy
9
我通过使用单词"should"来解决“createFrshSnapshot”问题,即“shouldCreateFreshSnapshot()”(尽管在这种情况下isSnapshotExpired()更好)。 - DJClayworth
1
我通过一个叫做 shouldHeartbeat() 的方法来检查是否需要发送心跳消息。 - Erick Robertson
为什么认为 isEmpty()hasChildren() 是“问题”,而不是“断言”?如果你把这些名称看作是断言或谓词,那么在英语中它实际上读起来更好一些。 - rick
1
可能对于断言来说,最好将其命名为assertIsEmpty()assertHasChildren() - Steven Pribilinskiy

31
如果您希望您的类与Java Beans规范兼容,以便利用反射的工具(例如Java BuildersJGoodies Binding)能够识别布尔值的获取器,请使用getXXXX()isXXXX()作为方法名称。根据Java Beans规范:

8.3.2 Boolean properties

In addition, for boolean properties, we allow a getter method to match the pattern:

public boolean is<PropertyName>();

This “is<PropertyName>” method may be provided instead of a “get<PropertyName>” method, or it may be provided in addition to a “get<PropertyName>” method. In either case, if the “is<PropertyName>” method is present for a boolean property then we will use the “is<PropertyName>” method to read the property value. An example boolean property might be:

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

当你说 public boolean is<PropertyName>(); 的时候确实有些让人困惑,看起来像是一个泛型。 - Erick Robertson
嘿,我只是引用规范。我会按照规范斜体显示。 - Jason S
7
我不在乎Java Bean的兼容性,我只希望我的方法名称听起来正确 :) - letronje
4
即使您不关心Javabeans的兼容性,遵循命名规范也是值得的,因为它已经远远超出了在IDE中配置“beans”的原始范围。例如,如果您使用isEmpty作为方法名称,您可以使用object.empty从JSP调用此方法,但是您无法使用其他前缀调用方法,因此您不能使用object.children来调用object.hasChildren()。因此,JSP和EL(表达式语言)允许您访问Javabeans属性。这对我来说是一个巨大的优势。 - Stijn de Witt
JavaBeans非常具体,谢谢您的提醒。我经常想并倾向于认为我被“is”前缀所困扰,但实际上并不是这样。 - Snicolas

29

我想分享这个链接,因为它可能有助于查看此答案并寻找更多Java风格约定的人。

Java编程样式指南

其中“2.13项目 应该用于布尔变量和方法。” 特别相关,并建议使用is前缀。

该样式指南继续建议:

有几个替代方案可以取代is前缀,适用于某些情况。 这些前缀是hascanshould

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

如果您遵循指南,我相信适当的方法应该被命名为:

shouldCreateFreshSnapshot()

2
请注意,这些准则受Geotechnical Software Services版权保护。尽管如此,他们在底部引用了来源,表明他们是合法的。 - Donal Lafferty

11

对于可能失败的方法,即返回类型为布尔值的方法,我会使用前缀try

if (tryCreateFreshSnapshot())
{
  // ...
}

对于所有其他情况,请使用前缀 is..has..was..can..allows.. 等。


16
"但是 try 并没有表达它是一个问题(具有返回值)的意思。" - Steve Kuo
2
永远不要返回布尔值来指示方法是否失败。如果方法失败了,就抛出异常。想象一下,如果方法失败并且你得到了一个false,你将如何确定出错的具体原因? - Wouter van Koppen
@WoutervanKoppen 同意。应该记住,异常应该仅用于异常行为。如果在上面的示例中无法创建新快照是常见情况,那么我建议创建一个名为 canCreateFreshSnapshost() 的方法,只有在调用成功后才调用一个名为 createFreshSnapshot 的方法,如果它意外失败,则可能返回异常。 - Ladislav Ondris

5

通常使用 ishas 作为前缀。例如,isValidhasChildren


2

is 是我遇到的最常见的单词。但在当前情况下,最好的选择是符合逻辑的选项。


1

我希望对这个通用的命名约定提出不同的观点,例如:

参见 java.util.Setboolean add​(E e)

其中的原理是:

进行一些处理,然后 报告 是否成功

虽然 return 确实是一个 boolean,但方法的名称应该指向完成处理而不是结果类型(在此示例中为布尔值)。

您的 createFreshSnapshot 示例似乎更相关于这个观点,因为它似乎意味着:创建一个新快照,然后报告创建操作是否成功。考虑到这种推理,createFreshSnapshot 的名称似乎是您的情况下最好的选择。


1
我不确定为什么你被踩了,我同意。虽然我避免使用它,因为它根本不语义化,但它是许多内部Java API使用的约定。 - Kamil Bęben
1
我猜可能是因为一开始我只写了“Set: boolean add(E e)”所以人们没有注意到它是关于众所周知的java.util.Set;或者可能是因为我的英语太差了:D。感谢您的点赞 :) - Adrian

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