实体对象的吸气,并制定者的数据属性
-
03-07-2019 - |
题
我最近开始工作,在爪哇和被引入到野性和疯狂的世界,吸气,并制定者的一切。我讨厌它在第一次,但很快得到使用。过用于它。
我已经花了很多时间,最近想更多关于流的设计。有一件事我想做的就是避免的陷阱的做吸气,并制定者的一切。然而,很多的工作,我要做的就是与实体,主要是数据的容器,我不肯定的是,干将制定者和实际上是不适当的,在这些情况。
这里是一个简单的例如使用公共性质。
class Space {
public String name;
public String description;
Space(final String name, final String description) {
this.name = name;
this.description = description;
}
}
这是一个简单的例子使用私人的属性和使用吸气,并制定者。
class Space {
private String name;
private String description;
Space(final String name, final String description) {
this.name = name;
this.description = description;
}
public String getName() {
return this.name;
}
public void setName(final String name) {
this.name = name;
}
public String getDescription() {
return this.description;
}
public void setDescription(final String description) {
this.description = description;
}
}
在这些例子中,两个的 name
和 description
领域应该能够被改变。
我感觉像吸气/器的例子更为明确和隐藏的执行情况的细节是什么 name
和 description
是。它还将允许验证上设定以后,如果需要的。
我读了几个讨论关于吸气,并制定者被邪恶和/或反模式,但它真的感觉就像那些可能不适用于这种情况。
也许有一些选项,我们尚未考虑。我建议!
解决方案
把它简单:
- 你需要吸气的所有领域,必须从外面。
- 你需要制定者的所有领域,必须从外面。
这可能是100%,但大部分时间较少。
其他提示
第一个版本(公共属性)不是一个好主意。第二个更好。正如Josh Bloch所说,“赞成不变性”。 :
public class Space {
private final String name;
private final String description;
public Space(final String name, final String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}
话虽这么说,吸气者和制定者倾向于过度使用。
你听说经常过于简单的“get / setters是邪恶的”。没人(我希望)真的意味着它对数据对象有任何不妥之处。我认为真正的想法是:
“Getters / Setters是邪恶的,除了普通数据存储对象”之外。这本身只是“告诉不要问”的传福音。
理想情况下,如果某个类具有getter和setter,那么它应该具有 all 。
无论如何,这就是争论。我不确定我同意它。
虽然访问器模式有助于隐藏类的实现细节(例如,使用哈希表来存储属性以便在稀疏使用的类上节省内存),但实现起来可能非常冗长(您的示例有12行更多的访问器)。这就是为什么C#有一个特殊的属性语法,它允许简明地指定默认访问器:
class Space {
public String Name { get; set; }
public String Description { get; set; }
Space(final String name, final String description) {
this.Name = name;
this.Description = description;
}
}
替代表单可能会添加访问说明符和/或代码:
private String _name;
public String Name {
get { if (_name == null) FetchName(); return _name; }
private set { _name = value; }
}