Getter & Setter: 使用还是废弃

为什么我们要使用私有的实例变量呢?因为我们不希望其他类直接的依赖于这些变量。而且在心血来潮时,我们还可以灵活的修改变量类型和实现。然而,为什么程序员们都自动在对象中加入getter和setter方法,以此对外暴露私有变量,就如同这些变量是公有的一样。

存取方法

存取方法(又被称为getters和setters)是一些可以用来读写对象实例变量值的方法。

public class AccessorExample {
private String attribute;

public String getAttribute() {
 return attribute;
}

public void setAttribute(String attribute) {
 this.attribute = attribute;
}
}

为什么使用存取方法?

在类中使用存取方法而非直接暴露属性是有理由的。

GetterSetter使得API更加的稳定。比如,假设类中有一个公共属性,它可以被其他类直接存取。一段时间后,你想要在读取或保存这个公共属性的时候添加额外的逻辑。这将影响到已经使用这个API的类。所以对这个公共属性的任何改变都会导致引用这个属性的其他类的改变。相反,使用存取方法,我们可以随后很容易的添加其他的一些逻辑,比如缓存数据,延迟加载。而且,如果新的属性值与旧的属性值不同,我们还可以触发属性改变事件。所有这些对于通过使用存取方法获取值的类来说都是透明的。

是否要对所有的属性都是使用存取方法?

属性可以被声明为包级私有或是私有嵌套类可见。在这些类中,相对于使用存取方法而言,对外直接暴露属性字段可以减少类定义和调用代码中的视觉混乱。

如果一个类是包级私有或是私有嵌套类可见,假设它的属性字段很好的描述了类所提供的数据,那么对外暴露这些属性字段本质上是没有问题的。

这样的类被限制在类所声明的包内,同时调用代码受限于类内部表示。我们可以修改这个类,而不