根据命名约定"has"具有前缀的 Java 布尔资源库



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

带有is前缀的示例:

private boolean active;
public boolean isActive(){...};//getter
public boolean setActive(boolean b){...};//setter

但是我不明白如何使用has前缀进行设置器

private boolean hasChildren;
public boolean hasChildren(){...};//getter
public boolean  ?(boolean b){...}//setter

在你的情况下,问题不仅仅是为二传手找到一个合适的名称。这也是你的getter不遵守惯例

规范和教程对此非常清楚:

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

遵循这些约定很重要,因为否则,许多自动(基于反射的)工具将不再按预期工作(例如内省器)。


撇开语法不谈,有几种选择可以解决这个问题。在评论中,建议将属性称为isParent,尽管严格来说,访问器必须被称为isIsParent......

所以我建议简单地将属性称为 havingChildrenowningChildren ,并提供相应的访问器方法,如 isHavingChildren/setHavingChildren ,或 分别isOwningChildren/setOwningChildren

根据 JavaBeans 规范(第 8.3.2 节),布尔字段foo的访问器方法是isFoo()并相应地setFoo(boolean)的。

您的案例将是访问器对isHasChildren()/setHasChildren()

作为建议,您应该考虑将字段重命名为 boolean childrenPresent; ,根据规范,这将派生为 isChildrenPresent()setChildrenPresent()

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

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

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

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

通过尝试手动操作该行为,您正在破坏封装和得墨忒耳定律,因为您的调用程序应该知道它拥有的对象,而不是其对象自己的对象的实现。我希望这是有道理的。

打个粗略的类比,你可以问一位女士她是否带着孩子,她会(希望)报告她的状态(或者因为你刚刚称她为"大"而开始哭泣)。如果是假的,你可以继续让她怀孕(当然要征得同意),你不会只是把一个婴儿塞在那里说"在那里,你现在怀孕了"。

如果它真的像在你的代码中一样,你对此有boolean,请继续使用 setHasChildren .

通常,

"has"类型的属性没有简单的 setter,因为它们通常报告的状态不受简单布尔值的支持,例如:

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

但当情况并非如此时,setHasXyz就没关系了。

您可以放心地选择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

当我们谈论 有孩子 , 有属性 ,我们谈论的是是否有任何集合附加到它。像子可以有很多,例如可以是列表或地图,而在isActive的情况下,我们只是表示单个属性值。您可以设置值 setHasChildren。但我认为命名约定是为了便于理解。

最新更新