[英]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
哪個不對。
不可變意味着一旦構造了對象,其狀態就不會改變。
從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更改myList
或obj
引用。 然而 ,obj的狀態以及列表仍然可以在內部進行操作。 正如其他人所指出的那樣,無論誰通過名單或obj1到你的班級,也能夠從外部操縱它。 由於在C ++中沒有類似const
的東西,我們必須復制對象以確保它們不會從外部更改。
同樣,如果有一個getter,它也應該只返回一個副本(或一些只讀接口或只讀包裝器):
public Object getObj() { return obj.clone(); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.