一尘不染

为什么要使用 getter 和 setter/accessor?

javascript

使用 getter 和 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; }

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


阅读 142

收藏
2022-02-17

共1个答案

一尘不染

际上有*很多充分的理由*考虑使用访问器而不是直接公开类的字段——不仅仅是封装的论点和使未来的变化更容易。

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

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