一、问题
大多数字段的访问都是通过 get/set 方法来间接访问,为什么不直接将字段设置为公开属性 public 呢?答案在于前者的未来可能性。
二、保持对该属性的控制
通过 get/set 公开它与使用 public 属性的主要区别在于保持对该属性的控制
。如果把一个字段公开,就意味着可以直接访问它。然后,调用者可以做任何事情,无论是有意或无意。例如,可以将字段设置为空值,如果在另一个方法中使用该字段,则该方法可能会因空指针异常而崩溃。
但是,如果提供了 get/set,可以在完全控制的同时提供间接访问。设置值的惟一方法是通过 set,获得值是通过 get ,字段只有一个入口和一个出口。因为 get/set 是允许代码块的方法,所以可以对它们进行验证检查,对象决定是否设置调用者值。这同样适用于 get 方法——可以决定返回实际的引用或克隆它,并将其返回给调用者。
因此,get/set 起到保险丝或断路器的作用。电流必须通过保险丝,如果发生故障,熔断器与主电路分离,电路是安全的。同样,如果出现任何错误,set 将不会将该值传递给类成员字段。
一般不写任何东西在 get/set 方法中。只返回并设置字段,就像公开字段一样。通过编写 get/set,创建了一个用于将来添加任何验证方法的条款,目前没有验证,但是如果将来出现任何错误,只是在 set 中添加验证逻辑。
三、代码通用
当一个字段没有这样的验证约束时,为什么要麻烦写 get/set?问题的关键在于避免使代码变得不必要的复杂。开发者试图使代码基础更加通用,适应于任何变化。虽然所想到的大部分变化永远不会到来。因此,get/set 不会使代码复杂,这将在代码中得到验证。