我最近开始在Java工作,并被介绍到疯狂和疯狂的吸气剂和制定者的世界。我起初讨厌它,但很快就习惯了。太习惯了。
我最近花了很多时间思考课堂设计。我要做的其中一件事就是避免为所有事情做吸气剂和制定者的陷阱。但是,我所做的大部分工作都是使用主要是数据容器的实体,我不确定在这些情况下,getter和setter实际上是不合适的。
以下是使用公共属性的简单示例。
class Space {
public String name;
public String description;
Space(final String name, final String description) {
this.name = name;
this.description = description;
}
}
这是一个使用私有属性并使用getter和setter的简单示例。
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
字段都应该可以更改。
我觉得getter / setter示例更清晰,并且隐藏了name
和description
的实现细节。如果需要,它还允许稍后进行验证。
我已经阅读了几个关于吸气剂和制定者是邪恶的和/或反模式的讨论,但它真的感觉那些可能不适用于这种情况。
也许我还有一些选择尚未考虑过。我愿意接受建议!
答案 0 :(得分:6)
第一个版本(公共属性)不是一个好主意。第二个更好。正如Josh Bloch所说,"favor immutability":
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;
}
}
答案 1 :(得分:4)
你听说经常过于简单的“获取/制定者是邪恶的”。没人(我希望)真的意味着它对数据对象有任何不妥之处。我认为真正的想法是:
“Getters / Setters是邪恶的,除了普通的数据存储对象”,它本身只是“告诉不要问”的传福音。
理想情况下,如果一个类有getter和setter,那么 all 就应该有。
无论如何,这就是争论。我不确定我同意它。
答案 2 :(得分:3)
说实话:
这可能是100%,但大部分时间都是较少。
答案 3 :(得分:0)
虽然访问器模式有助于隐藏类的实现细节(例如,使用哈希表来存储属性以便在稀疏使用的类上节省内存),但实现起来可能非常冗长(您的示例有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; }
}