java - 如果类具有 java.lang.Object 的实例变量,我如何使它成为不可变的?

标签 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());
    }
}
o/p : Mon Aug 22 00:50:04 IST 2011

这是不正确的。

最佳答案

不可变意味着一旦对象被构建,它的状态就不会改变。

  • 完成类(class)(您已经完成)
  • 将实例变量设为私有(private)和最终
  • 不要提供改变状态的方法
  • 传递实例变量时,发送副本而不是原始变量。

来自 EJ Item 15 <-- 里面有很多信息

类应该是不可变的,除非有很好的理由让它们可变。如果不能使类不可变,请尽可能限制其可变性。

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

相关文章:

scala - 可变 MultiMap 到不可变 Map

scala - 如何在保持不变性的同时访问 Scala 中的复杂数据结构?

javascript - 我应该对仅具有函数的对象使用不变性吗?

Java - 具有 If 语句打印顺序错误的主方法

java - 为什么我收到数字格式异常?

java - Try/Catch 对构造类构造函数中抛出异常的影响

C# 不重复的不可变和可变类型

java - 如何使可变对象列表不可变

java - 无法在内部类中声明 Public static final String s = new String ("123")

java - 在mysql中将mysql日期格式转换为dd-mmm-yyyy