封装与隐藏实现。

来源:互联网 发布:销售数据管理制度 编辑:程序博客网 时间:2024/05/04 06:32

在java设计原则中有一条是开闭原则,即对扩展开放,对修改关闭。
java设计一直以来追求的目标也是把可变的和不变的分开来。
我们还经常设想这样一种情况,当我们开发一段公用程序共给别人使用后,他最好只能够使用其中的功能,而不能够进行修改,最好是,我们进行修改的时候不会影响他的使用。
这些设计都需要我们能够进行很好的封装,把必要的展示给对方,而把隐私的部分隐藏起来。
java是通过java访问权限修饰符来达到这个目的的。

java的访问权限有四种:private,default,protected,public越来越大。

这四个访问修饰达到的效果是,你只能通过如下手段使一个成员被访问到:

  • 把它设置为public,这样不管在什么地方都能够访问该成员。
  • 设置为protected。子类能够通过super来访问父类中的protected,public的成员。
  • 设置为default权限,这样只有同一包内的类能够访问这个成员。比如A,B同包,A中就能通过B的实例来访问B的default,protected,public的成员。
  • 继承之后的成员的可加性修饰没有变,但是可加性的命名空间还是父类的。如下列代码:

代码中已有说明,可以证明,其可见性的命名空间还是父类的。

 

单例

说封装,就不得不说单例呀,使用私有构造器和static类型的getInstance()方法得到一个在虚拟机只能存在一个实例的特殊对象。

通常我们可以把配置信息或者是比较大的耗费内存的并且基本不变的信息都设置为单例,以节约空间。

下面是例子:

枚举

是用来保存固定的一些常量的封装,比如扑克牌的花色只有四种,在以往的做法中,我们是使用了常量来表示。

比如我们现在有一个方法需要接受扑克的花色为参数。而花色的四种参数我们使用Int类型的常量表示。

f(int i)就是这个方法,这个表示扑克的封装我们可以写成一个接口,如:

这样我们使用f方法的时候就可以使用f(SuitInterface.SUIT_SPADES)来得到特定的输入值,但是这种方式没有类型验证,不能保证我们传给f的参数都是四个值中的一个。使用枚举类型,就能够避免这个问题。

 

方法f改为f(SUIT)。

SUIT是一个枚举:

我们可以使用f(SUIT.SPADES)来调用方法了,我们可以认为SUIT.之后的每一个值都是SUIT类的一个实例。但是这些实例是不同的。

他还有着更高级的用法:

这种带了构造器的枚举类型,在其枚举值中需要有像构造器一样的形式。然后我们可以进行一些特殊的操作。

原创粉丝点击