java - 为什么要使用 getter 和 setter/accessors?

标签 java oop setter getter abstraction

使用 getter 和 setter(仅获取和设置)比简单地使用这些变量的公共(public)字段有什么优势?

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

public String foo;

比以下更糟糕:

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

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

最佳答案

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

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

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

关于java - 为什么要使用 getter 和 setter/accessors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49549151/

相关文章:

ruby - 如何使用 Setter 使 Ruby 类表现得像散列

iphone - Setter Getter 奇怪@property

android - MutableStateflow 值与更新与发射

java - JDesktopPane 在 Linux 上的窗口底部有一个工具栏

java - Groovy Grails 工具套件需要 Java 运行时环境 1.6.0

C#:嵌套类的命名约定和正确的实现?

c++ - Has-a关系的继承

c++ - 面向对象 : How to Choose from a Number of Implementations

java - 您如何思考和预测这样的线程问题的输出?

java - android-如何更改滑动选项卡的默认位置