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

这是不正确的。

最佳答案

你不能让它不可变,因为这个对象不能创建列表或对象内容的副本。假设您打算使用 getter 来访问这些属性,那么这些属性本身是在别处创建的,并且可以在引用该类的外部代码中进行更改。

唯一的异常(exception)是 Object 和 List 的内容本身是不可变的。然后你可以创建一个不可变的列表副本,你就完成了。

关于java - 如果类具有 java.lang.Object 的实例变量,我如何使类不可变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7126138/

10-12 22:22