2011-12-16 60 views
1

包裝我有一個類似如下:建立一個只讀了

class A{ 
    // it has some getters and setters 
} 

還有一種類叫器類它建立A類

class BuilderA{ 
    // builds A and returns an instance. 
} 

現在我要準備一個只讀類A確保Class newA只有ClassA的getter而不是setter。

我這樣做是爲了確保如果我通過這個紐瓦我是安全的,沒有人可以使用getter和作出紐瓦任何變化,如果我直接使用A類可發生..

可有人告訴我我怎麼能做到這一點..?

+1

另一種選擇是使用一個不可變的類(只有getters)並使用構建器創建它們。 http://en.wikipedia.org/wiki/Builder_pattern – Stefan 2011-12-16 15:02:45

回答

0

如果你想要一個解決問題的通用解決方案,你必須將getter和setter提取到一個接口中,然後使用Proxy來攔截所有以set開頭的方法或者讓他們註釋(並在你的Handler中處理註釋)和那麼無論什麼都不做或者最好拋出一個UnsupportedOperationException。

如果您只需要1或2個班級,這將是過度的技巧,並且會帶來更大的開銷。

0

您可以擴展A類並實現拋出UnsupportedOperationException的setter或者在調用時不做任何事情。您無法關閉對類A的公共setter方法的訪問權限,仍然是類A的實例(通過子類)。

1

下面是一個例子:雖然這個工程

public class Person { 
    String name; 

    public Person(String name) { 
     this.name = name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

public class ImmutablePerson extends Person { 

    public ImmutablePerson(String name) { 
     super(name); 
    } 

    @Override 
    public void setName(String name) { 
     throw new UnsupportedOperationException(); 
    } 
} 

public class PersonBuilder { 
    public static Person createMutablePerson(String name) { 
     return new Person(name); 
    } 

    public static Person createImmutablePerson(String name) { 
     return new ImmutablePerson(name); 
    } 
} 

,我不認爲這是一個Java設計類的一個好方法。

引用Joshua Bloch的「有效的Java」,類應該是不可改變的,除非你有一個非常好的理由說明它們應該是可變的。

+0

好吧,但這不是一種類型安全的方式,你只會在運行時注意到有人在`ImmutablePerson`上調用setter。 – Jesper 2011-12-16 15:19:46

0

對於這個(java.lang.reflect.Proxy),您可以很容易地使用Proxy,然後您只需查看調用的方法名稱(大致看是否以set開頭)。開銷應該相對最小,並且它不需要爲每個附加類編寫代碼。您可以使用註釋進一步編碼來指定允許/拒絕的setter。

public static boolean isSetter(Method method){ 
    if(!method.getName().startsWith("set")) return false; 
    if(method.getParameterTypes().length != 1) return false; 
    return true; 
}