带有"的Java布尔设置器有"根据命名约定的前缀

时间:2015-01-31 13:43:08

标签: java naming-conventions

简单的问题,但我无法理解。

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

7 个答案:

答案 0 :(得分:7)

您的案例中的问题不仅仅是为setter找到合适的名称。还有你的getter不符合约定

specificationtutorial非常明确:

  • 属性的setter应以set
  • 为前缀
  • 非布尔属性的getter应以get
  • 为前缀
  • 布尔属性的getter应以is
  • 为前缀

遵循这些惯例非常重要,否则许多自动(基于反射的)工具将无法按预期工作(例如Introspectors)。


除了语法之外,还有几种方法可以解决这个问题。在评论中,建议调用属性isParent,尽管如此,严格来说,访问者必须被称为isIsParent ...

因此我建议您只需将该属性称为havingChildrenowningChildren,并提供相应的访问方法,例如isHavingChildren / setHavingChildren,或者 分别为isOwningChildren / setOwningChildren

答案 1 :(得分:2)

根据JavaBeans Specification(第8.3.2节),布尔字段foo的访问器方法相应地为isFoo()setFoo(boolean)

您的案例将是一个访问者对isHasChildren() / setHasChildren()

作为建议,您应该考虑将字段重命名为boolean childrenPresent;,根据规范,该字段会导出到isChildrenPresent()setChildrenPresent()

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

我希望如果你没有孩子(hasChildren()== false)然后是addChild(Whatever),那么下次你调用hasChildren时,它会返回true。

通过尝试手动操作该行为,您将打破封装和Demeter法则,因为您的调用程序应该知道其拥有的对象,而不是其对象自身对象的实现。我希望这是有道理的。

为了做一个粗略的比喻,你可以问一位女士她是否带着孩子,她(希望)会报告她的状态(或者因为你刚刚打电话给她而开始哭泣&#34;大)。如果不对,你可以继续让她怀孕(当然要经过同意),你不会只是把孩子抱在那里然后说'那里,你现在怀孕了#34;。 / p>

答案 5 :(得分:0)

如果它与您的代码完全相同,那么您有boolean,请继续使用setHasChildren

通常,&#34;有&#34;各种属性都没有简单的设置器,因为它们通常报告一个不受简单布尔支持的状态,例如:

private List<Child> children;
// ...
public boolean hasChildren() {
    return children.size() > 0;
}
// ...
public void addChild(Child c) {
    // ...
}

但如果情况并非如此,setHasXyz就可以了。

答案 6 :(得分:-1)

当我们谈论hasChildren,hasAttributes时,我们正在谈论是否附加了任何集合。就像孩子可以是很多,例如可以是列表或地图,而isActive,我们只是表示单个属性值。 您可以设置值setHasChildren。但后来我认为命名约定是为了方便理解。