简单的问题,但我无法理解。
带有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
......
所以我建议简单地将属性称为 havingChildren
或 owningChildren
,并提供相应的访问器方法,如 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。但我认为命名约定是为了便于理解。