分类: Java
2012-12-29 01:51:15
不变模式是一种比较普遍的一种设计模式,在我们所使用的一些类中就使用到了不变模式,比如Integer,String等。不变模式中,允许多个类对某个类进行访问,省略了同步化的消耗,使系统运行更加高效,提高了系统的健壮性(robustness)。类在实例化之后,其状态不允许被修改变化,当要修改状态时,需要创建一个新的对象来替换该类,实现状态的修改。给出下面例子:
我们要修改str的状态,虚拟机会冲洗创建一个对象来代替“China”,让str重新指向这个对象:
即str指向“I love China”新对象来实现状态的修改。
不变模式只涉及到一个类,在这个类实例从创建到消亡其状态不会发生变化,这个类被称作不变类。不变模式有两种模式,弱不变模式和强不变模式,下面分别对这两种模式给出说明。
◆弱不变模式
该类的实例不会发生变化,但是该类的子类的实例的状态可能会发生变化。
满足弱不变模式的条件:
1. 类中不能够存在改变类实例状态的方法,当该类的构造子完成类的实例化后,实例的状态不会被类中的方法改变;
2. 类中的属性必须为私有的,不能声明任何公有的属性。这样才能保证类在实例化之后,其状态不会被其它类修改其内部状态;
3. 同上,类中的状态尽量保持不变。当引用到外界的可变对象时,应该尽量设法限制对该可变对象的访问,防止在访问的时候修改可变对象状态。如果可以在类的内部初始化该可变对象,应该在类的内部进行初始化;如果必须从外部传入可变对象,应该在类初始化的时候就传入该可变对象的一份拷贝,而不是该可变对象。防止在传入该对象之后,实例之外有可变对象的其它引用,对可变对象进行修改。
◆强不变模式
强不变模式是在弱不变模式条件下的增强,不仅该类在初始化之后状态不能被改变,其子类的状态也不能被改变。强不变模式要求较弱不变模式高,所以强不变模式不仅要满足若不变模式的要求,还要满足下面要求之一:
1. 该类所有方法为final的,子类不能够覆盖父类中的方法,从而保证子类中的属性不能够被篡改;
2. 该类定义成final,即该类不能够有子类,其方法默认为final,因此不会被改变;
弱不变模式跟强不变模式相比存在某些明显的弱点:
不变模式的优点:
不变模式的缺点:
由于不变类从初始化后就不能被修改,若要修改其状态,只能创建新的对象来替换其原来的对象。如果系统中这种操作太过频繁,会极大的降低系统性能,比如String类的“相加”,如果操作频繁,速度受影响较大。在这种情况就可以考虑使用替代方案,例如用StringBuilder和StringBuffer替换String来进行字符串的频繁操作。