你要求相当于 const 在Java中。这是不可能的。多年来,许多用户都要求将其作为Java(包括我自己)的增强功能。它被关闭并被Sun拒绝。
const
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
如果你想这样做,你必须在你的对象中构建一个可变性标志(可能在构造时)。然后在每个mutator方法中,检查可变性标志。也许您可以使用代理库(如CGLIB)做一些更“花哨”的事情,但对于您要实现的目标,它可能过于复杂。
如果我理解你的目标。你可以使用这样的东西
class Wraper<T>{ List<T> list = new ArrayList<T>(); //Other Collection? T someObj = getYourInstance(); public T get(int index) { T obj = list.get(index); if (obj.equals(someObj)){//should be overriden return createInstanceOf(obj); } else { return obj; } } }
我可以想到使类不可变的唯一方法是将其包装在代理中 - 然后您可以访问控制任何变异方法:
即。
MyClass { private int anInt; public void setInt(int a) { anInt = a; } public int getInt() { return anInt; } ...
然后
MyProxy { private MyClass myClass = ...; public int getInt() { return myClass.getInt(); } ...
等等。
你也可以通过反射实现同样的东西(就像Spring包装bean一样,你通常只与他们的代理交互)
不过,如果客户端掌握了实际的底层类(本例中为MyClass),那么他们就能够改变内部。没有真正的方法可以直接阻止它,除了只是暴露你让客户看到的“可变”包装