在阅读一些教程时,我看到他们指定 getter 和 setter 方法应该是公共的。
这通常在教程中完成,因为它更容易编写,同时还提供“某种面向对象的感觉”,因为您仍然可以使用 getter 和 setter 进行一些控制。
您也可以(不推荐)使用公共字段并完全省略 setter 和 getter:
public class Foo {
public int i;
public String s;
}
但是当使用 setter 时,您可以例如验证数据:
public class Foo {
public void set(int temperature) {
if(temperature < 273) throw new IllegalArgumentException();
this.temperature = temperature;
}
}
但是,如果您需要一次验证多个值怎么办?使用 setter,您只能始终验证当前值,但不能同时验证多个 setter 调用。这是公共设置者不好的一种情况。
另一件事是:面向对象的编程非常注重名称:setXYZ 你说的不多。例如setTemperature 可能适合恒温器。但就是这样。也许你甚至得到了更高级的东西:setTemperatureLevel(值 1-5)然后设置内部desiredTemperature,当这个值高于你想要设置heater 到true 的当前温度时。
使用简单的设置器时,您无法控制是否所有这些步骤都按正确的顺序完成,或者是否跳过了某些步骤。但是使用 setLevel 方法在类中完成所有这些操作,没有办法搞砸方法调用者。
当然,在 Java 世界中,这些公共 setter 和 getter 非常方便:在许多框架中,例如将数据库映射到 DAO 或用于 JSON 反/序列化的 DTO,它使事情变得更容易。因为这里它被用作读取和写入对象字段的约定。这些对象通常称为 JavaBeans。
但是当涉及到您的域对象时,我强烈建议您将不希望其他人访问和/或操纵的所有内容保密。