为什么使用 getter 和 setters/accessors?

2022-08-31 01:25:34

使用 getter 和 setters (只 get 和 setter)而不是简单地为这些变量使用公共字段有什么好处?

如果 getter 和 setter 所做的不仅仅是简单的 get/set,我可以很快弄清楚这一点,但我不是 100% 清楚:

public String foo;

比以下情况更糟:

private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }

而前者需要的样板代码要少得多。


答案 1

实际上,有很多很好的理由可以考虑使用访问器,而不是直接公开类的字段 - 而不仅仅是封装和使将来的更改更容易的论点。

以下是我所知道的一些原因:

  • 封装与获取或设置属性相关的行为 - 这允许以后更轻松地添加其他功能(如验证)。
  • 隐藏属性的内部表示形式,同时使用替代表示形式公开属性。
  • 将公共接口与更改隔离开来 - 允许公共接口在实现更改时保持不变,而不会影响现有使用者。
  • 控制属性的生存期和内存管理(处置)语义 - 在非托管内存环境(如C++或Objective-C)中尤其重要。
  • 在运行时提供属性更改时的调试拦截点 - 在某些语言中,调试属性更改为特定值的时间和位置可能非常困难。
  • 改进了与旨在针对属性 getter/setter 进行操作的库的互操作性 - 我想到了模拟、序列化和 WPF。
  • 允许继承者更改属性行为方式的语义,并通过重写 getter/setter 方法公开属性。
  • 允许 getter/setter 作为 lambda 表达式而不是值进行传递。
  • Getter 和 setter 可以允许不同的访问级别 - 例如,get 可能是公共的,但集合可以受到保护。

答案 2

因为从现在开始的2周(几个月,几年)后,当你意识到你的设置者需要做的不仅仅是设置值时,你也会意识到该属性已被直接用于238个其他类:-)