getter 和 setter 方法有什么意义?

一般在书上看到都解释都是 把成员变量直接暴露在外不符合OOP的封装性原则,不安全,应该使用getter和seter方法来取值和赋值。但是没有解释为什么…
关注者
444
被浏览
177,420

24 个回答

的确可以暴露,如果1. 所有内外代码都是你自己写;2. 这个模块再也不改了;3. 不会继承它,或者继承但不改变语义。

David John Wheeler有一句名言:

“All problems in computer science can be solved by another level of indirection.”

getter、setter就是个很好的中间层。

直接摘录stackoverflow上一个不错的总结:

oop - Why use getters and setters?
  1. 这两个方法可以方便增加额外功能(比如验证)。
  2. 内部存储和外部表现不同。
  3. 可以保持外部接口不变的情况下,修改内部存储方式和逻辑。
  4. 任意管理变量的生命周期和内存存储方式。
  5. 提供一个debug接口。
  6. 能够和模拟对象、序列化乃至WPF库等融合。
  7. 允许继承者改变语义。
  8. 可以将getter、setter用于lambda表达式。(大概即作为一个函数,参与函数传递和运算)
  9. getter和setter可以有不同的访问级别。

同意

@仲晨

的回答,但是这里还想从另外一个更宏观的角度,以我的理解做一点补充。

对于OOP,宏观上来说,设计者都在试图做到的一件事情就是如何当好程序中的上帝。通过设计良好的接口(这里的良好指的是不多也不少)来对外暴露一个对象的能力,使得使用者只需要充分了解接口,就可以了解这个对象所能提供的能力。

而使用“方法”来表达对象的能力,同使用“变量”相比,从宏观上来说,没有什么区别,只是形式上的不同。但使用“方法”来表达接口,更容易体现OOP的一个核心理念“隐藏细节”