如果它有一个java.lang.Object的实例变量,我如何创建一个类Immutable?

ami*_*ngh 4 java immutability

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());
    }
}
Run Code Online (Sandbox Code Playgroud)
o/p : Mon Aug 22 00:50:04 IST 2011
Run Code Online (Sandbox Code Playgroud)

哪个不对.

Kal*_*Kal 6

不可变意味着一旦构造了对象,其状态就不会改变.

  • 让课程决赛(你已经完成)
  • 将实例变量设为private和final
  • 不要提供改变状态的方法
  • 传递实例变量时,发送副本而不是原始副本.

从EJ项目15 < - 更多信息在那里

类应该是不可变的,除非有一个很好的理由使它们变得可变.如果一个类不能成为不可变的,那么尽可能地限制它的可变性.


Rob*_*bin 2

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

唯一的例外是 Object 和 List 的内容本身是不可变的。然后您可以创建列表的不可变副本,这样就完成了。