根据命名规范,使用“has”前缀的Java布尔类型setter函数是什么?

7

这是一个简单的问题,但我不太理解。

is前缀的例子:

private boolean active;

public boolean isActive(){...};//getter

public boolean setActive(boolean b){...};//setter

但是我不明白如何使用以has为前缀的setter方法。

private boolean hasChildren;

public boolean hasChildren(){...};//getter

public boolean  ?(boolean b){...}//setter

4
setHasChildren?只要语义明确,它并不是那么重要... - Dici
7个回答

12
你的问题不仅在于找到适当的setter名称,还在于你的getter没有遵循惯例! 根据规范教程,以下是一些约定:
  • 非布尔属性的setter应以set为前缀
  • 非布尔属性的getter应以get为前缀
  • 布尔属性的getter应以is为前缀
遵循这些约定很重要,因为否则,许多自动(反射型)工具将无法按预期工作(例如内省器)。解决此问题有几种选择。建议将属性命名为havingChildrenowningChildren,并提供相应的访问器方法,如isHavingChildren/setHavingChildrenisOwningChildren/setOwningChildren

1
我认为值得注意的是,规范和教程并没有说布尔属性的getter方法应该以“is”为前缀;它只是说明允许使用这种格式。这是规范中引用的话:“可以提供“is<PropertyName>”方法代替“get<PropertyName>”方法,或者在提供“get<PropertyName>”方法的同时提供“is<PropertyName>”方法。” - David

3
根据JavaBeans规范(第8.3.2节),布尔字段foo的访问器方法分别为isFoo()setFoo(boolean)
你的情况将是一个访问器对isHasChildren()/setHasChildren()
作为建议,你应该考虑将字段重命名为boolean childrenPresent;,这将根据规范派生出isChildrenPresent()setChildrenPresent()

@Waldheinz 很好! 但是如果我们这么做,实际上可以将其作为类的属性之外的结果,例如给定 Collection children;return children.isEmpty(); 并且永远不需要直接设置(而是来自于对集合的添加) ;) 我根据您的评论进行了修改。 - h7r
@Waldheinz,实际上,我不太喜欢你的想法:“parent”会让我想到对其他对象的引用(比如树)。但是我可能有点过于偏向图形了 :) - h7r

0

你可以放心使用setHasChildren,因为它完全清晰明了。然而,如果你需要存储有关子项的更多信息,可能需要改变答案。

例如,如果你需要存储子项,只有setter才有意义,而子项将由一个集合表示:

// no hasChildren attribute
private Collection<ChildClass> children;
public boolean hasChildren(){ return !children.isEmpty(); };
// no setter

另一个例子,如果您要存储孩子的数量:

// no hasChildren attribute
private int childrenCount;
public boolean hasChildren(){ return childrenCount > 0 };
// no setter

0

对于布尔值,您可以在getter方法中使用is作为前缀,或者您也可以使用get作为前缀。

public boolean isHasChildern();//getter
public boolean getHasChilder();//getter
public boolean setHasChildren(boolean active);//setter

0
如果您的代码确实如此,其中有一个布尔值来表示这一点,请继续使用setHasChildren。
通常,“has”类型的属性没有简单的setter,因为它们通常报告的是不由简单布尔值支持的状态,例如:
private List<Child> children;
// ...
public boolean hasChildren() {
    return children.size() > 0;
}
// ...
public void addChild(Child c) {
    // ...
}

但是当情况不是这样时,setHasXyz 是可以的。

0

hasChildren正在检查一个对象的状态,因此我通常不会期望有一个setter方法。

我期望如果你没有孩子(hasChildren() == false),然后添加一个孩子(Whatever),下一次调用hasChildren时,它将返回true。

通过手动尝试操纵这种行为,你违反了封装和Demeter法则,因为你的调用程序应该知道它拥有的对象,但不知道对象自己对象的实现。希望这样说得清楚一些。

打个粗略的比喻,你可以问一个女士是否怀孕,她会(希望)报告她的状态(或者开始哭泣,因为你刚刚称她为“大”)。如果是假的,你可以继续让她怀孕(当然要经过同意),而不是只是把一个婴儿塞进去然后说“好了,你现在怀孕了”。


-1
当我们谈论 hasChildren、hasAttributes 时,我们指的是它是否有任何附加集合。比如 children 可以是多个,例如可以是列表或映射,而在 isActive 的情况下,我们只表示单个属性值。 您可以设置值 setHasChildren。但我认为命名约定是为了方便理解。

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