为什么要使用 getter 和 setter/访问器?

新手上路,请多包涵

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

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

原文由 Dean J 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 714
2 个回答

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

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

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

原文由 LBushkin 发布,翻译遵循 CC BY-SA 3.0 许可协议

因为从现在起 2 周(月、年)后,当您意识到您的 setter 需要做的 不仅仅是 设置值时,您还将意识到该属性已在 238 个其他类中直接使用:-)

原文由 ChssPly76 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题