反射和封装是否矛盾
引入
在学习完面向对象,好不容易能将面向对象三大特性之一的封装理解了,别人问起:封装性是什么?
答:将该隐藏的隐藏起来,该展现的展现出来。提高程序的可读性,代码的扩展性,提高安全性…balaba
问:那反射可以获取私有的属性,方法,构造,那你封装还有什么意义呢?
解释封装性
- 首先可以肯定的回答是不矛盾,不然别人为啥这么设计呢?
- 第二,我个人认为你要站在不同的角度去思考他,才能说明到底矛不矛盾。
比如,封装是我们站在程序员去编码的角度,我们需要让程序有可读性,层次结构能体现其属性或者方法的本身特征,例如属性私有化,说明我们不希望别人能直接调用,但又提供了get和set方法来供其调用。
再例如,单例模式设计时,我们需要让构造方法私有化,为了不能让别人在通过构造器去创建这个对象 - 站在程序员角度我们需要这些来约束和规范自己的开发,和编码规范
解释反射
-
反射是站在我们不知道对象的内部结构但是又不得已非得用到他的时候,比如在各大框架的编写中我们能发现,运用到了很多了反射知识。
目的:为了能动态的产生用户需要的对象,这也正是反射才为我们提供了这么多便捷的框架来供我们开发。
这也是反射的真实用处和意义所在 -
但是如果你用反射来获取上面所说的封装的属性,方法并且随意改变他们可以么?
当然可以,但是原本你所做的封装就被破坏了,这也就说明了你以前做的封装工作白做了,用反射可以获得私有构造,那单例就不是单例了? -
不是,你学习过程中这样去尝试当然是学习知识和发现问题的过程,但真实谁又会这样做呢?因此弄清两者的使用场景和意义最为重要
总结
- 两者并不矛盾,且两者都能同时存在,只是使用场景和意义不同。
- 反射主要意义在框架的编写,和其他需要的应用上。
- 封装是我们约定俗成的编码时,结合项目和对象本身结构的特殊性做的包装,也就是封装的意义