簡體   English   中英

如果它有一個java.lang.Object的實例變量,我如何創建一個類Immutable?

[英]How can i make a class Immutable if it has a instance variable of java.lang.Object?

final public class ImmutableWithObject {

    final Object obj;
    final List myList;

    ImmutableWithObject(Object obj1, List list)
    {
        this.obj = obj1;
        this.myList = ((List) ((ArrayList) list).clone());
    }

    public Object getObj() {
        return this.obj;
    }

    public List getMyList() {
        return (List) ((ArrayList<String>) this.myList).clone();
    }

    public static void main(String[] args) {

        ImmutableWithObject io = new ImmutableWithObject(new Date(), new ArrayList());

        ((Date) io.getObj()).setDate(22);

        System.out.println((Date) io.getObj());
    }
}
o/p : Mon Aug 22 00:50:04 IST 2011

哪個不對。

不可變意味着一旦構造了對象,其狀態就不會改變。

  • 讓課程決賽(你已經完成)
  • 將實例變量設為private和final
  • 不要提供改變狀態的方法
  • 傳遞實例變量時,發送副本而不是原始副本。

從EJ項目15 < - 更多信息在那里

類應該是不可變的,除非有一個很好的理由使它們變得可變。 如果一個類不能成為不可變的,那么盡可能地限制它的可變性。

您無法使其不可變,因為此對象無法創建列表或Object的內容的副本。 假設您想要訪問這些屬性的getter,屬性本身是在別處創建的,並且可以在此類的外部代碼中更改,該類具有對它的引用。

唯一的例外是Object和List的內容本身是不可變的。 然后,您可以創建列表的不可變副本,您將完成。

您可以復制List對象的值。 無論誰調用它仍然具有該List並且可以修改它。

將成員變量設為private final並復制參數:

final class ImmutableWithObject {

    private final Object obj;
    private final List myList;

    public ImmutableWithObject(Object obj1 , List list)
    {
       this.obj = obj1.clone();
       this.list = (List) list.clone();
    }
}

這將不允許任何其他類更改您的內部狀態,並且不允許ImmutableWithobject更改myListobj引用。 然而 ,obj的狀態以及列表仍然可以在內部進行操作。 正如其他人所指出的那樣,無論誰通過名單或obj1到你的班級,也能夠從外部操縱它。 由於在C ++中沒有類似const的東西,我們必須復制對象以確保它們不會從外部更改。

同樣,如果有一個getter,它也應該只返回一個副本(或一些只讀接口或只讀包裝器):

 public Object getObj() { return obj.clone(); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM