携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
抽象的目的在于设计类的框架,确定属性和方法,而接下来的封装,则要隐藏类的属性或部分方法。
最简单的操作方法就是,把所有的属性都设置为私有属性,每个私有属性都提供 getter 和 setter 公有的方法,封装后的类图如下图所示,在类图中设定了类的成员变量的初始值。
总结
抽象,实际上是一个分析的过程,是根据需求的表述归纳实体的类型、属性和行为,其产出物是类图。类图勾勒了实体应该具备哪些属性和行为,但未涉及细节。
而封装,实则就是将抽象得到的模型转变为具体实现。它的要点是,尽可能对外隐藏细节,Java 中的手段就是使用 private,所以在上述案例中所有的属性都是 private。但是否简单粗暴地为所有属性提供 getter 和 setter 呢?不建议这样做,因为这样做和将属性定义为 public 没有区别。封装的关键是,根据业务进行分析,有的属性不能修改则不提供 setter,有的属性的修改有限制规则,则需要在 setter 中进行限定,有的属性不希望外界获取则不提供 getter(或声明为私有的),有些方法或者函数仅仅是内部使用的,也可以声明为 private,这些都是具体问题具体分析的。
抽象,是归纳提炼;封装则是在实现中依据业务需求尽量隐藏细节。