封装性是什么?
所谓封装,就是先把客观事物封装成抽象概念的类,将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
通俗的说,封装就是先把事物聚集到一起,再用一个外壳将其包装。对外,用户可以操作,但是不知道内部具体的操作细节,这就是封装。
本质上也就是把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装的设计思想。
为什么需要封装性?
在生活中,人人都要使用洗衣机,使用者只需要按下开关和洗涤模式即可,具体洗衣机内部的结构根本没有必要了解。同样,年满18岁之后都要学会开车,驾驶员根本不知道离合、油门及刹车的原理,但依旧可以开的很好。在客观世界中,每一个事物的内部信息都隐藏在其内部,外部无法直接操作和修改,只能通过指定的方式进行操作。这就是封装性的体现,试想一下,如果人人都要学会操作内部才可以使用机器,那么人类社会的发展将是无比缓慢的。对比到我们的系统中:
随着系统的日渐复杂,类会越来越多,如果不将其封装起来,那么可能操作一个类的同时,其他无数个类会被影响到,这将会是非常可怕的影响。但是,我们如果把握好类之间的访问边界,这样不仅设计成本降低,操作成本也大大降低。这也符合了面向对象的设计原则:高内聚、低耦合。
高内聚、低耦合是软件工程中的概念,也是UNIX操作系统设计的经典原则。
内聚:指一个模块内各个元素彼此结合的紧密程序。
耦合:指一个软件结构中不同模块之间相互连接程度的度量。
内聚意味着重用和独立;耦合意味着多米诺效应,牵一发而动全身。
而高内聚、低耦合的体现之一:
高内聚:类的内部操作和细节自己完成,不允许外部干涉。
低耦合:仅保留少量的方法给外部使用。
如何实现封装性?
根据封装性的概念可知,封装性就是把该隐藏的隐藏,该暴露的暴露。也就是说,需要控制类内部成员的权限,即根据权限的不同,不同的外部也会看到不同的成员。
由上可得,实现封装性就需要依赖访问控制修饰符,也称为权限修饰符。
权限修饰符
private、确省、protected、public。
|-----------|------|-----|--------|---------|
| 权限修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包的非子类 |
| private | √ | | | |
| 确省 | √ | √ | | |
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
注意
-
对类的内部成员来说,四种权限修饰符都可以使用。
-
对外部类来说,只有public以及确省可以使用。
-
对外部类来说,四种权限修饰符都可以使用。
封装性的体现
场景一:私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改。
场景二:将类中不需要对外暴露的方法,设置为private。
场景三:单例模式中构造器private,避免在类的外部创建实例。
总结
所谓封装性,就是先将事物化作成抽象概念的类,再将数据与操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅暴露供外部使用的方法。通俗的讲,就是暴露该暴露的,隐藏该隐藏的。万事万物都有存在的意义,而对于封装性来说,就是因为系统的复杂,类越来越多,这就需要把握好类与类之间的边界,这就是封装存在的概念,用较为官方的语言来说,就是"高内聚、低耦合"。有了封装性,也有了为啥要存在封装性,那最后肯定就是怎么来实现封装性了。在Java中,体现封装性的方法就是使用权限修饰符来控制类内部成员的可见范围。上述大致就是我理解的封装性的内容,封装性相对来说是一种思想,而不是一种实现手段,权限修饰符才是实现方法,就好比Spring中的IoC和DI一样,IoC只是思想,DI才是技术。