2015-03-13 76 views
2

這段代碼很熟悉。有沒有辦法在java中創建一個不可變的對象,當對象有mutators?

List<Character> list = new ArrayList<Character>(); 

    // populate the list 
    list.add('X'); 
    list.add('Y'); 


    // make the list unmodifiable 
    List<Character> immutablelist = Collections.unmodifiableList(list); 

現在我有一個典型的模型類與變量,getter和setters。在我引用了我想要的setter之後,我可以使該Object不可變嗎?像這樣的東西是我的夢想......

Person person = new Person(); 
person.setFirstName("firsName"); 
person.setLastname("lastName"); 
// i have a lot to set!!- Person is pretty large 

// some way to do this 
Person stubborn = Object.immutableObject(person); 

我知道有沒有Object.immutableObject()..但有可能實現這樣的事情?

+0

可能重複:// stackoverflow.com/questions/6305752/how-to-create-immutable-objects-in-java) – silentprogrammer 2015-03-13 16:38:16

+0

沒有一種方法可以完成列表實現的功能 - 但您也可以克隆該對象。這樣,如果新對象是原始對象,將不會被修改。 – Obicere 2015-03-13 17:14:03

+0

注意與 - 如何在Java中創建不可變對象?我希望對象是可變的 - 但有時候我可能會決定,我已經做了必要的編輯 - 不應該再做更多的編輯。 – searchingforPerfection 2015-03-16 13:15:05

回答

4

有沒有一般的方法來獲得這種行爲。

您可以使用構造函數創建一個ImmutablePerson類,該構造函數將接受一個Person並構造該Person的不可變版本。

+1

這是一個比截掉mutators更加清潔和安全的方法。爲了提高可用性,'Person'應該擴展'ImmutablePerson'或者更好 - 兩者都應該實現一個通用接口。 – 5gon12eder 2015-03-13 16:46:00

0

當然,只需在Person對象中有一個布爾標誌,它表示對象是否被鎖定以進行修改。如果它被鎖定,那麼所有的設置者都不會做任何事情或讓他們拋出異常。

當調用immutableObject(person)時,只需將該標誌設置爲true即可。設置標誌也會鎖定/拒絕稍後設置/更改標誌的能力。

1

沒有做任何工作就沒有辦法做到這一點。

您需要創建從作爲伊蘭暗示可變的一個新的不可變對象要麼得到一個編譯時檢查,通過分割界面 如

添加一些代碼的運行時檢查,或者得到一個較弱的編譯時間檢查
interface ReadOnlyPerson { 
    int getX(); 
} 

interface ModifiablePerson extends ReadOnlyPerson{  
    void setX(); 
} 

class Person implements ModifiablePerson { 
} 

然後,您可以在構建後傳出不可變引用。

但這種模式並沒有給出有力的保證,該對象將不會被修改爲ReadOnlyPerson參考可投等

[如何使用Java創建一個不可改變的對象?(HTTP的
相關問題