在面向对想得编程中经过会碰到setter和getter这类访问接口,那么什么时候应该使用呢?使用它的好处是什么呢?
首先,访问函数的封装的一种手段,并不是用了访问函数就是封装,封装是经过充分思考后,设计的一组接口。在不需要封装的时候,我们完全可以暴露类中的属性。
可以完全暴露属性的时机:
- 当全部代码都是自己写的时候。这时候应该是工作量不大,我们一个人开发的时候,进行封装的意义不大,充分地设计封装是浪费时间。
- 当代码肯定不会更改时,或者暴露属性的语义不会改变时。这意味着当一个字段的抽象固定下来,不管日后需求怎么变都不会改变这个属性,那我们完全可以暴露这个属性。
使用它的好处在于:
- 方便增加额外的操作。比如:我们要验证调用者输入的值是否符合要求,或者有些变量之间的联动,需要在修改自身值的时候也改变其他地方的值。
- 调试方便。比如:我们要看看属性值的变化,可以在setter函数中置断点或者打印属性。
- 控制属性的生命周期和属性的存储管理。比如:我们直接把一个指针暴露给外界,那么这个属性的生命周期就不可控了,外部可能随时会销毁。这个特性对于没有内存托管的语言非常重要。
- 属性的内部存储的形式和外部调用的形式可以不一样。例如:一个指针属性,我们可以将其指向的内容暴露给外部,而不是指针。
- 任意修改内部实现,而不影响外部调用。这个其实就是封装的意义。
- 更加精细的访问控制。比如:get可以是public,而set是protect
- 允许继承制改变属性语义。比如:类的继承者可以重载get和set实现不同的操作。