更特殊的情況:
我寫了一個不變類PartySchool,放在那裡,後來忙別的事情去了,把這一塊維護工作交給了另一個哥們,當他調用這個類的時候發現,創建一個ps對象以後想讓ps從handsome變成不handsome是不可能的,於是他想了一招:
public class VirtualPS extends PartySchool{
public VirtualPS(Stringappearance,Dog myDog)
{
super(appearance,myDog);
this.appearance = super.getAppearance();
}
private String appearance;
public void setAppearance(String app)
{
this.appearance = app;
}
public StringgetAppearance()
{
return this.appearance;
}
public static void main(String[]args) {
DogmyDog = new Dog("Douglas");
VirtualPSvps = new VirtualPS("handsome",myDog);
System.out.println(vps.getDog().getName());
System.out.println(vps.getAppearance());
vps.setAppearance("nothandsome");
System.out.println(vps.getAppearance());
}
}
CodeIP-6
遺憾的是他成功了。
總結:
需滿足的條件:
1. 該類的物件沒有任何方法可以修改物件的狀態。即當類的構造函數將該類的物件初始化之後,該物件的狀態便至死不渝。
2. 所有的屬性都應該是私有的,且不提供任何公開的屬性。(不解釋)
3. 如果該類如果引用的其他物件是可變的話,需設法限制外界對該可變對象的訪問。儘量不要在用戶端初始化這些可變物件,若不可避免則在不變物件初始化時,將這個可變物件Clone一份而不要使用原來的拷貝。
使用滿足以上條件的類為弱不變模式。
弱不變模式的缺點:
1. 一個弱不變物件的子物件可以是可變物件。
2. 這個可變的子物件可能可以修改父物件的狀態,從而可能會允許外界修改父物件的狀態。
強不變模式:
弱不變模式之所以弱,是因為它控制不了它的子類,那讓不變類可以控制它的子類就可以克服弱不變模式的兩個缺點了。
把所有的方法前面加上final.
或者:
把類前面加上final.
世界清靜了!
不變模式在Java中的應用:
只引用代碼不解釋
public final classString
implements java.io.Serializable, Comparable<String>,CharSequence
{
private final char value[];
private final int offset;
private final int count;
private int hash; // Default to 0
private static final long serialVersionUID = -6849794470754667710L;
……
}