始终建议使用getter / setter访问私有变量。为什么将它们声明为公共并访问它们并不是一个更好的主意。无论如何我们使用getter和setter访问它?
答案 0 :(得分:19)
答案 1 :(得分:12)
@mre答案非常好,你的问题很重要。总结一下:您将对象的字段设置为私有,以控制其他对象使用它的方式。您的对象使用setter:
它将使用getter
欢迎来自OO编程的精彩世界和结构化编程的魔力。
斯特凡
答案 2 :(得分:11)
上面的所有答案都非常好,但是我再补充一点。
您不希望所有私有变量都拥有公共getter和setter。
你的getter和setter指的是外部可见的状态。在某些情况下,在公共方法中发布的单个对象对应于实现的多个内部私有变量。在复杂对象中,许多私有变量不会映射到外部可见的内容。有些人无论如何都会自动为他们编写setter和getter,但这是一个坏主意,因为它暴露了你的实现细节。
答案 3 :(得分:7)
我总是被告知,其中一个主要原因是尝试计划未来的变化。它可能只是
public int getInt() { return _someInt;}
但最终可能会
public int getInt() {
// do some processing
return _someInt;
}
这将使您不必对访问公共属性的地方进行大量更改,而不是使用getter / setter。
答案 4 :(得分:5)
通常,setter允许您对分配给私有成员的值的类型保持限制。所以也许不允许负值等等。
一个getter,因为你因为上述原因将其设为私有而强制访问该成员,所以允许消费者访问该成员的值。
答案 5 :(得分:4)
所有其他答案都很棒且非常真实。这是我发现它有用的另一个原因。
在对象上使用getter和setter是遵循JavaBean convention的最大部分。虽然遵循它通常是困难和过度的,但至少许多第三方框架/库/表达式语言依赖于访问对象字段的getter和setter约定。如果您预先跟进它,那么您已经可以将这些对象与其他非常有用的库一起使用,而无需更新对象。
我使用过的例子包括:
答案 6 :(得分:1)
我经常使用getter和setter,但显然我们做得不对。例如:(从http://java.dzone.com/articles/java-properties-without获得)
用吸气剂&塞特(长途)public class Teacher {
@Id @Column(length=5) @Required
private String id;
@Column(length=40) @Required
private String name;
@OneToMany(mappedBy="teacher")
private Collection pupils;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection getPupils() {
return pupils;
}
public void setPupils(Collection pupils) {
this.pupils = pupils;
}
}
with public :(只有13行,计算空行)。
@Entity
public class Teacher {
@Id @Column(length=5) @Required
public String id;
@Column(length=40) @Required
public String name;
@OneToMany(mappedBy="teacher")
public Collection pupils;
}
使用getter& setter(没有一点清楚,但C#使它更清洁)。
teacher.setName("M. Carmen");
String result = teacher.getName();
呼叫公共(直接和干净)。
teacher.name = "M. Carmen";
String result = teacher.name;
一个是冗长的,它增加了更多的代码(以及工作时间和处理时间的代码成本),而另一个是直接的。
在某些情况下,必须使用setter和getter,但如果没有,那么我认为将它用作默认值有点过分。