简单的问题,但我无法理解。
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
答案 0 :(得分:7)
您的案例中的问题不仅仅是为setter找到合适的名称。还有你的getter不符合约定!
specification和tutorial非常明确:
set
get
is
遵循这些惯例非常重要,否则许多自动(基于反射的)工具将无法按预期工作(例如Introspectors)。
除了语法之外,还有几种方法可以解决这个问题。在评论中,建议调用属性isParent
,尽管如此,严格来说,访问者必须被称为isIsParent
...
因此我建议您只需将该属性称为havingChildren
或owningChildren
,并提供相应的访问方法,例如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。但后来我认为命名约定是为了方便理解。