Getter 和 setter 已成为 Java 世界中事实上的封装标准:对象对关联类隐藏其内部实现的想法。这是面向对象编程的总体原则。
以下面的类为例:
// boilerplate
public class A {
public String b;
}
这是一个完全有效的 Java 类,只有一个字段。如果另一个类希望读取 A 的 B 属性,它只需要:
A a;
String val = a.b;
并写:
a.b = val;
这里的问题是 A 不再控制对其内部状态的写入。假设我们了解到 b 的最大长度为 1024 个字符。现在必须更新写入 b 的每个实例以适应新要求。根据代码库的大小,这可能非常昂贵。
或者,假设我们使用 getter 和 setter 约定来封装 b:
// boilerplate
public class A {
private String b;
public void setB(String val) {
this.b = val;
}
public String getB() {
return this.b;
}
}
现在看起来像:
A a;
String val = a.getB();
并写道:
a.setB(val);
这在短期内需要更长的时间来编写,但全面的更改更容易集成,只需更改设置器即可。
封装受到高度重视,正如许多其他评论者所指出的那样,许多 Java 框架都期待这一点。