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類 所有性能代價更大。