经验丰富的Java开发人员会在何时以及何时不使用代码库中的getter和setter以及accessor方法的情况下进行检查。
Java Getter设置器
为什么我们将实例变量设为私有?我们不希望其他类依赖它们。而且,它需要灵活性,可以一时兴起或一时冲动地更改变量的类型或实现。那么,为什么程序员会自动将getter和setter添加到其对象中,从而像公开一样公开其私有变量?
存取器方法
访问器(也称为getter和setter)是使您可以读写对象的实例变量的值的方法。
public class AccessorExample {
private String attribute;
public String getAttribute() {
return attribute;
}
public void setAttribute(String attribute) {
this.attribute = attribute;
}
}
为什么要使用存取器?
实际上,有很多充分的理由考虑使用访问器,而不是直接公开类的字段。
Getter和Setter使API更加稳定。例如,考虑一个类中的公共字段,其他类可以访问该字段。稍后,如果我们想在获取和设置变量时添加任何额外的逻辑,这将影响使用该API的现有客户端。因此,对此公共字段进行的任何更改都将要求对引用它的每个类进行更改。另一方面,使用访问器方法,可以轻松添加一些逻辑,例如缓存某些数据或延迟初始化。
访问器方法还允许我们在新值与先前值不同的情况下触发属性更改事件。
使用setter设置值的另一个优点是,在设置值时,我们可以使用该方法保留不变式或执行一些特殊处理。
所有这些对于使用accessor方法获取值的类都是无缝的。
我应该为我的所有字段都使用访问器方法吗?
对于包私有或私有嵌套类,可以将字段声明为公共字段。与访问器方法相比,在类定义中以及在使用它的客户端代码中,与访问器方法相比,暴露这些类中的字段所产生的视觉混乱更少。
如果一个类是程序包私有的或私有嵌套的类,则公开其数据字段并没有天生的错误-假设它们在描述该类提供的抽象方面做得足够好。
此类代码仅限于声明该类的包,而客户端代码则绑定到一个类的内部表示。我们可以更改它,而无需修改该程序包之外的任何代码。而且,在私有嵌套类的情况下,更改的范围进一步限于封闭类。
使用公共字段的设计的另一个示例是JavaSpace条目对象。肯·阿诺德(Ken Arnold)描述了他们决定使用此处的get和set方法将这些字段公开而不是私有的过程。
现在,这有时使人们感到不舒服,因为有人告诉他们不要使用公共场所,并且公共场所不好。规则有其原因。专用数据规则的原因不适用于这种特殊情况。这是该规则的罕见例外。我还告诉人们不要在其对象中放置公共字段,但是存在例外。这是该规则的一个例外,因为仅说它是一个字段就更简单,更安全。我们坐下来问:为什么是这样的规则?是否适用?在这种情况下,不是。
专用字段+公共访问器==封装
考虑下面的