作为一般经验法则,您希望在您的类属性和扩展点上成为as restrictive as possible(私有> 受保护> 公有)。这对于需要长时间运行并需要维护和重构的项目尤其重要。
一旦使用了一段时间,就很难将您的属性从公共限制为受保护/私有,因为您不知道有多少其他类依赖这些公共属性。另一方面,从 private 放松到 protected/public 的创伤较小,因为您不必担心以前在没有该类的情况下访问该属性。
话虽如此,getter 和 setter 为您提供了与类的私有成员交互的独特联系点。这在 OOP 中称为encapsulation。这意味着您可以确保与这些属性交互的每个人都以相同且一致的方式进行操作。一个愚蠢的例子是属性的规范化:
private String name;
public void setName(String name) {
this.name = StringUtils.capitalize(name);
}
您在这里确保设置名称的人不需要关心其大小写,因为您通过 setter 强制执行它。这同样适用于 getter,根据需要应用业务规则。
与访问公共财产相比,您每次使用它时都需要利用它...
最后,我想说的是,盲目地向对象添加 getter 和 setter 是 bad practice。仅在有充分理由存在时才提供这些访问器。例如:
class Person {
private name;
public Person(String name) {
this.name = name
}
public String name() {
return name;
}
}
您通常不会设置人名,因此我们可以一起省略该 setter。但是每个人都有一个名字。在这种情况下,您可以通过其构造函数强制执行它。这样可以明确区分,增强您的设计并防止您的对象处于不一致状态。