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

Posted

技术标签:

【中文标题】返回布尔值的 Java 方法的命名约定【英文标题】:Naming conventions for Java methods that return boolean 【发布时间】:2011-04-21 22:06:33 【问题描述】:

我喜欢在其他语言的方法/函数名称末尾使用问号。 Java 不允许我这样做。作为一种解决方法,我还能如何在 Java 中命名布尔返回方法?在某些情况下,在方法前面使用ishasshouldcan 听起来不错。有没有更好的方法来命名这些方法?

例如创建新鲜快照?

【问题讨论】:

什么语言允许在方法名中使用? @SLaks、Scheme、Ruby ... 在方案中,我们总是在方法名的末尾加上p @Erick:并非总是如此,但“p”是指定谓词的一种标准方式 我们 = 我的本科课程总是这样。我永远不会在 Java 中使用这种约定。 【参考方案1】:

惯例是在名字中提问。

这里有几个可以在 JDK 中找到的例子:

isEmpty()

hasChildren()

这样,名称的读取方式就像在末尾带有问号一样。

集合是空的吗? 这个节点有孩子吗?

然后,true 表示是,false 表示否。

或者,您可以像断言一样阅读它:

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

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

在这种情况下,您应该重新考虑您的实际要求。 isSnapshotExpired 之类的名称更好,它传达了该方法在调用时将告诉您的内容。遵循这样的模式还可以帮助您保持更多的函数纯净且没有副作用。

如果您在 Java API 中为 isEmpty() 执行 Google Search,您会得到很多结果。

【讨论】:

createFreshSnapshot 怎么样? @letr,好吧,我可能会将它重命名为 lit isSnapshotExpired 或类似的名称。 (根据您的标准) 我通过使用“应该”这个词来解决“createFrshSnapshot”问题 - 即“shouldCreateFreshSnapshot()”(尽管在这种情况下 isSnapshotExpired() 更好) 我检查是否应该使用shouldHeartbeat() 方法发送心跳消息。 为什么认为isEmpty()hasChildren()问题,而不是断言?如果您将这些名称视为断言或谓词,它实际上在英文中读起来会更好。【参考方案2】:

如果您希望您的类与Java Beans specification 兼容,以便使用反射的工具(例如JavaBuilders、JGoodies Binding)可以识别布尔getter,请使用getXXXX()isXXXX() 作为方法名称.来自 Java Beans 规范:

8.3.2 布尔属性

此外,对于布尔属性,我们允许使用 getter 方法来匹配模式:

public boolean is属性名>();

可以提供这个“isPropertyName>”方法来代替“getPropertyName>”方法,或者除了“get”之外还可以提供它PropertyName>” 方法。在任何一种情况下,如果布尔属性存在“isPropertyName>”方法,那么我们将使用“isPropertyName>”方法来读取属性值.一个示例布尔属性可能是:

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

【讨论】:

当你说public boolean is<PropertyName>(); 时,它看起来像一个泛型。 嘿,我只是在引用规范。我会按照规范用斜体显示。 我不在乎 Java bean 的兼容性,我只希望我的方法名称听起来正确 :) 即使您不关心 Javabeans 的兼容性,命名约定也值得遵循,因为它已经超出了 IDE 中配置的“beans”的原始范围。例如,如果使用 isEmpty 作为方法名,则可以使用 object.empty 从 JSP 调用该方法,但是不能调用带有其他前缀的方法,因此不能使用 object.children 调用 object.hasChildren()。因此,JSP 和 EL(表达式语言)允许您访问 Javabeans 属性。如果你问我,这是一个很大的胜利。 JavaBeans 非常具体,谢谢提醒。我经常想知道并且倾向于认为我被“is”前缀所困扰,但实际上根本不是。【参考方案3】:

我想发布此链接,因为它可能有助于进一步检查此答案并寻找更多 java 样式约定

Java Programming Style Guidelines

Item "2.13 is 前缀应该用于布尔变量和方法。"特别相关并建议使用 is 前缀。

风格指南继续建议:

is 前缀有一些替代方案,在某些情况下更适合。这些是 hascanshould 前缀:

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

如果您遵循指南,我相信会命名适当的方法:

shouldCreateFreshSnapshot()

【讨论】:

仅供参考,有版权岩土软件服务指南。也就是说,他们在底部引用了来源以表明他们是合法的。【参考方案4】:

对于可能失败的方法,即你指定 boolean 作为返回类型,我会使用前缀 try:

if (tryCreateFreshSnapshot())

  // ...

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

【讨论】:

但 try 并没有表明这是一个问题(有返回值)。 从不返回布尔值来指示方法是否失败。如果方法失败,则抛出异常。想象一下方法失败了,你得到一个错误,你将如何确定到底出了什么问题?【参考方案5】:

标准是使用ishas 作为前缀。例如isValidhasChildren

【讨论】:

【参考方案6】:

is 是我遇到的最多的人。不过,在当前情况下任何有意义的事情都是最好的选择。

【讨论】:

【参考方案7】:

我想对这个通用命名约定提出不同的看法,例如:

见java.util.Set:boolean add​(E e)

理由是:

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

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

在我看来,您的createFreshSnapshot 示例与此观点更相关,因为似乎意味着:创建一个新快照,然后报告创建操作是否成功。考虑到这种推理,createFreshSnapshot 似乎是最适合您的情况的名称。

【讨论】:

我不知道你为什么被否决,我同意。即使我避免使用它,因为它根本不是语义的,它是许多内部 java API 使用的约定。 我猜是因为最初我只写了“Set: boolean add​(E e)”所以人们没有注意到那是关于众所周知的 java.util.Set;或者可能是因为我的英语太差了:D。感谢您的支持:)

以上是关于返回布尔值的 Java 方法的命名约定的主要内容,如果未能解决你的问题,请参考以下文章

一种返回布尔值的方法,该布尔值标识两个数组的值是不是相同

返回值为布尔值的方法

检查整数是不是为 0 并返回布尔值的简短方法

返回 int 值的布尔方法;

返回布尔值的 Perl 函数实际上返回啥

计算 Python 列表中真正布尔值的数量