关于gitXXXsetXXX方法我相信大家肯定都用过,也有很多人会产生一个疑问,那就是为什么不直接把这个变量的访问权限改为public的不是更加方便吗。一开始我一直有这个疑问,下面就来解释一下。

第一种说法:

一开始,我听到的最多的说法就是getXXXsetXXX 可以提高类的封装性,直接用public会破坏类的封装性等等,可是我实在是没有发现getXXXsetXXX 怎么可以提高类的封装性,随着自己学的越来越多,就越怀疑这个说法,因为没法证明,所以绝对是个无稽之谈。

第二种说法:

 “get()和set()方法起到对外界封闭的作用,举个例子:假如你的裤兜里有很多钱,你肯定不会让别人都来掏,肯定只有自己能拿到,或者你拿出来给他,set和get就相当与你的手 而你类里的变量就相当与你兜里的钱,对于外面的人来说不知道你类里有什么他就知道调用这个get会给他一个什么东西”
 我最讨厌的就是这种偷换概念胡乱举例子的人,这让一些人大眼一看,感觉回答的很专业、很形象、很生动、很有说服力,真坑爹。

最靠谱的说法:

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表达式。(大概即作为一个函数,参与函数传递和运算)getter和setter可以有不同的访问级别。

有理有据,非常好。这才是真正的Java中gitter、setter方法和public的区别。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐