布尔类型的getter/setter方法和属性的语法

3
写布尔类型的getter/setter方法时,通常的标准是这样写:
void setValue(boolean value) { }

boolean getValue() { return true/false; }

然而,我见过一些用法表明getter方法应根据其用途适当命名。

比如说,如果我正在设置/获取一个名为“enabled”的布尔值,那么我的getter应该被称为:

getEnabled()

或者

isEnabled()

再举一个例子,假设我正在设置/获取一个名为“nodes”的布尔值,那么我的getter应该被称为:

getNodes()

或者

hasNodes()

这只是个人偏好吗?还是选择一种特定的命名约定比其他更好?

6
"nodes" 听起来是一个非常不好的布尔类型的名称。 - BoltClock
2
我认为这取决于你的个人喜好(或团队/雇主的喜好)。然而,我想说的是,如果我看到一个bool getNode()方法,我会感到困惑... - Alxandr
1
如果“nodes”是布尔值,最好使用“isNodes”,但如果“nodes”是集合,则最好使用“hasNodes”。 - Vytalyi
1
C#将属性作为一流概念:在C#中通常不需要显式地使用getValue / setValue,而是使用具有get/set 访问器的Value。 - Marc Gravell
请参考Jigar Joshi的这个答案 - Jesper
不是要挑剔,但 Boolean != boolean,这就是在大多数情况下 get vs is 起作用的地方。boolean 不能为 null,而 Boolean 可以为 null。 - O'Mutt
4个回答

4
这篇答案假设问题与Java有关:
遵循惯例总是更好的选择。一些框架,比如Spring,与Java Beans惯例紧密耦合。

1
在C#中,属性不是方法。虽然它们是方法,但是一种特殊类型的方法。
您可以像这样声明一个属性:
public bool Enabled
{
   get
   {
       // return your value
   }
   set
   {
      // assign your value
   }
}

1
个人偏好,但我也不喜欢我的属性带动词性质。如果这是 C#,而且我正在实现它,我会将其命名为 启用。你说的对,它不是一个方法,所以我会避开像动词或动词短语作为名称的方法约定。 - Marc Bollinger
不要紧,你已经有一个动词或动词短语了。无论哪种方式,当你说“IsEnabled”时,更明显的是你的意思是这个东西是否当前启用,而不是(比如说)它在过去某个时间点是否启用 - cHao

0

这是我喜欢C#的一个(众多)原因之一

public bool Enabled
{
    get { return _enabledValue;}
    set { _enabledValue = value;}
}

而且调用该属性是非常“自然”的

myControl.Enabled = true;
...

if(myControl.Enabled == true)

同样道理,这就是我更喜欢C#的原因...更多的语法糖! - Matthew Layton
问题仍然存在,这个属性应该被称为Enabled还是IsEnabled? - Matthew Layton
我仍然更喜欢使用“Enabled”。包含动词会让我想到一个动作,而我认为属性就像类的属性。 - Steve
@activwerx:我个人更喜欢这样。那样,或者“has”等等。我喜欢我的布尔值是动词形式的,因为该标志本质上表示某些东西是否真实的...或者某些东西是否具有某种属性...或者某些东西是否执行其他操作。这大约是80%的个人偏好。(另外20%在你必须与其他代码兼容时发挥作用。) - cHao
@cHao,我恳求您将我不是英语母语者这一事实作为减轻情节的因素。 - Steve
显示剩余4条评论

0
在Java中:
所有的getter和setter必须至少有4个字符,并且第四个字母必须是大写字母。
唯一的例外是booleanBoolean类型的getter,它们可以是3个字母长,并且可以以is开头,第三个字符必须是大写字母。

1
你的第一行应该写“第四行”吗? - Marc Gravell
为什么getter和setter必须至少为4个字符?如果它们不是,程序会崩溃吗?还是应该用“应该”代替“必须”? - Matthew Layton
我经常使用只是字段名称的getter和setter。我这样做是为了清楚地表明它们不是JavaBean。然而,如果你想利用基于JavaBean的库,你必须遵循约定,否则这些方法将被忽略。 - Peter Lawrey
@activwerx:Java Bean规范。根据这些规范,getter的命名应该像getSomething(对于布尔值可以使用isSomething)。如果您不遵循这种命名约定,IDE和Bean用户可能无法识别您的属性。当然,如果您不在意这一点,您可以使用“is”、“has”、“may”或任何其他您想要的名称。 - cHao
如果 (myControl.Enabled) { .... - Jawid Hassim

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