返回布尔值的Java方法的命名约定(无问号)


93

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

例如,createFreshSnapshot?


2
?方法名称中允许使用哪种语言?
SLaks 2010年

11
@ SLaks,Scheme,Ruby ...
Skilldrick

在方案中,我们始终把一个p在方法名的末尾
埃里克·罗伯逊

@Erick:并非总是如此,但是“ p”是指定谓词的一种标准方法
Jason S

我们 =我的本科生计划课总是做。我永远不会在Java中使用此约定。
艾里克·罗伯逊

Answers:


121

惯例是用名字问一个问题。

以下是在JDK中可以找到的一些示例:

isEmpty()

hasChildren()

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

收藏集是否为空?
这个节点有孩子吗?

然后,true是,是,false不是。

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

集合为空。
该节点有孩子

注意:
有时您可能想为方法命名,例如createFreshSnapshot?。如果没有问号,该名称意味着该方法应该创建快照,而不是检查是否需要快照。

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

如果你做一个谷歌搜索isEmpty()Java API中,你会得到很多结果。


那createFreshSnapshot呢?
letronje 2010年

4
@letr,好吧,我可能会将其重命名为light isSnapshotExpired或类似的名称。(根据您的条件)
jjnguy 2010年

8
我通过使用单词“ should”来解决“ createFrshSnapshot”问题,即“ shouldCreateFreshSnapshot()”(尽管在这种情况下,isSnapshotExpired()更好)
DJClayworth 2010年

1
我检查是否应使用一种shouldHeartbeat()方法发送心跳消息。
艾里克·罗伯逊

为什么会认为isEmpty()hasChildren()问题,而不是断言?如果您将这些名称视为断言或谓词,它的英文阅读实际上会稍微好一些。
里克

29

如果您希望您的类与Java Beans规范兼容,以便利用反射的工具(例如JavaBuildersJGoodies Binding)可以使用getXXXX()isXXXX()作为方法名称来识别布尔型getter 。根据Java Beans规范:

8.3.2布尔属性

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

public boolean is< PropertyName > ();

可以提供此“ is < PropertyName >”方法来代替“ get < PropertyName >”方法,或者可以是“ get < PropertyName >”方法的补充。在任一情况下,如果“是< 属性名 >”的方法是存在用于一个布尔属性然后,我们将使用“是< 属性名 >”方法来读取的属性值。布尔属性的示例可能是:

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

当您说它public boolean is<PropertyName>(); 看起来像通用名称时,这很令人困惑。
艾里克·罗伯逊

嘿,我只是引用规格。我将按照规范将其斜体显示。
杰森·S

4
我不在乎Java Bean的兼容性,我只希望我的方法名称听起来正确:)
letronje 2010年

4
即使您不关心Javabeans的兼容性,也应遵循命名约定,因为命名约定已经超出了在IDE中配置的“ beans”的起源范围。例如,如果使用isEmpty作为方法名称,则可以使用object.empty从JSP调用此方法,但是不能使用其他前缀的方法,因此不能使用object.children来调用object.hasChildren()。因此,JSP和EL(表达语言)使您可以访问Javabeans属性。如果你问我,这是一个巨大的胜利。
Stijn de Witt 2010年

JavaBeans非常具体,感谢您提醒。我经常感到奇怪,并倾向于认为我坚持使用“ is”前缀,但实际上并没有。
尼克斯(Snicolas)

26

我想发布此链接,因为它可能进一步帮助窥视者检查此答案并寻找更多的Java样式约定

Java编程风格指南

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

样式指南继续建议:

在某些情况下,可以使用is前缀代替一些前缀。这些是具有可以并且应该前缀:

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

如果您遵循准则,我相信适当的方法将被命名为:

shouldCreateFreshSnapshot()

2
仅供参考,有指导方针是版权的岩土软件服务。也就是说,他们在底部引用了来源以表明他们是合法的。
Donal Lafferty 2015年

11

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

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

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


15
但是try并不能表示这是一个问题(具有返回值)。
郭富城2010年

切勿返回布尔值以指示方法是否失败。如果方法失败,则引发异常。想象一下该方法失败了,您得到一个错误,那么您将如何确定到底出了什么问题呢?
Wouter van Koppen

5

标准是使用“ is”或“ has”作为前缀。例如isValidhasChildren


2

is是我遇到最多的人。在当前情况下,任何有意义的方法都是最佳选择。


0

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

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

理由是:

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

尽管return确实是boolean方法名称,但方法名称应指向要完成的处理,而不是结果类型(此示例为布尔值)。

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


1
我不知道为什么你会被否决。即使我避免使用它,因为它根本不是语义的,所以它是许多内部Java API所使用的约定。
卡米尔·本本

1
我猜是因为最初我只写了“ Set:boolean add(E e)”,所以人们没有注意到这与众所周知的java.util.Set有关。也许是因为我的英语太糟糕了:D。感谢您的支持:)
adrhc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.