通常建议使用getter/setter来访问私有变量。但是,如果将它们声明为公共的并直接访问它们,是否更好呢?毕竟我们仍然使用getter和setter访问它们呢?
通常建议使用getter/setter来访问私有变量。但是,如果将它们声明为公共的并直接访问它们,是否更好呢?毕竟我们仍然使用getter和setter访问它们呢?
@mre的回答很棒,而你的问题是基础的。总结一下:将对象的字段设置为私有可以控制其他对象对其使用方式。您的对象使用setter来:
它将使用getter来
欢迎来到面向对象编程的奇妙世界和结构化编程的魔力。
Stéphane
以上所有答案都很好,但是我想再补充一点。
你不希望所有的私有变量都拥有公共的getter和setter方法。
你的getter和setter方法指的是外部可见状态。在某些情况下,看起来像一个单一对象在你的公共方法中发布,实际上对应于多个内部私有变量的实现。在一个复杂的对象中,许多私有变量不会映射到任何外部可见的东西。有些人自动为它们编写setter和getter方法,但这是一个坏主意,因为它会暴露你的实现细节。
我一直听说IT技术中的主要原因之一是尝试规划未来的变化。它可能最初只是一个简单的
public int getInt() { return _someInt;}
public int getInt() {
// do some processing
return _someInt;
这样做可以避免你在访问公共属性时不必进行大量更改,而是使用getter/setter。
我经常使用getter和setter,但显然我们并没有做对。例如:(来自http://java.dzone.com/articles/java-properties-without)
使用getter和setter(非常冗长的方式)
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;
}
}
公共的:(只有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;