使用繼承或委託來定義immutable classes

1、Immutable interface(不可變接口)

假設你有一個表示圓圈的mutable class  MutableCirle, 你想把它變成immutable object。

class MutableCircle{

   private double radius;

   public MutableCircle(double r){

       radius = r;

   }

   public void setRadius(double r){

      radius = r;

   }

   public double radius(){

      return radius;

   }

}

爲了讓這個class成爲一個immutable class, 你可以聲明一個immutable interface再由這個class去實現它。如:

interface ImmutableCircle{

  public double radius();

}

class MutableCircle implements ImmutableCircle{

   private double radius;

   public MutableCircle(double r){

     radius = r;

  }

  public void setRadius(double s){

    radius = r;

 }

  public double radius(){

    return radius;

 }

}

由於immutable interface僅僅暴露底部class的non-mutating methods,可以通過這個interface訪問的objects能保持不變性。

ImmutableCircle iwheel = new MutableCircle(6);

這種方法隱藏了setRadius方法。但是他人還是可以通過cast到MutableCircle去調用setRadius。

2、公共接口或公共基類

定義一個公用的接口或基類,然後在實現兩個subclass 一個是mutable 一個immutable。

如:

interface PinNumbers{

    public String accountOwner();

    public int checkingPin();

    public int savingsPin();

}

class MutablePinNumbers implements PinNumbers{

   private String acctOwner;

   private int checkingAcctPin;

   private int savingAcctPin;

   MutablePinNumbers(String owner,int cPin,int sPin){

      acctOwner = owner;

       checkingAccPin = cPin;

      savingsAcctPin = sPin;

  }

   // 下面提供mutable函數實現代碼。

  pubic void setAccountOwner(String str){

      acctOwner = str;

   }

// 下面是每個field的getter// setter方法。

}

final class ImmutablePinNumbers implements PinNumbers{

   private String acctOwner;

   private int checkingAcctPin;

   private int savingAcctPin;

   ImmutablePinNumbers(String owner,int cPin,int sPin){

      acctOwner = owner;

       checkingAccPin = cPin;

      savingsAcctPin = sPin;

  }

// all fields getter method

}

3、不可變的委託類(immutable Delegation Class)

其實是複合的實現方式,將外界對他們的調用任務委託(delegates)給class內含的mutable object。 如:

上面的circle classes可以實現爲。

class MutableCircle{

   private double radius;

   public MutableCircle(double r){

      radius = r;
   }

  public void setRadius(double r){

     radius = r;
  }

   public double radius(){

     return radius;

  }

}

final class ImmutableCircle{

   private MutableCircle mCircle;

   public ImmutableCircle(){

  mCircle = new MutableCircle(r);

  }

  public double radius(){

     return mCircle.radius();

  }

}

書上說這種方式要以性能爲代價, 我覺得這種實現更優秀, effective java 中說過 複合優與繼承。

*所說的性能可能是表面上是immutable類但是實際上內部還是mutable類 所有性能代價更大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章