在我用Java创建一个不可变的对象的过程中,我标记了类final,它的所有变量都是final,并且没有提供setter和getter.这些是否足以保证对象不会被修改?是3个必要条件还是3个条件中的2个绰绰有余?
小智 6
public final class MyClass
Run Code Online (Sandbox Code Playgroud)
与不变性无关,它只是不允许继承.
仅标记变量引用final是不够的,您引用的每个对象也必须是不可变的.
final 不会使对象成为不可变的,它使引用不可变;
private final List<String> strings = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
strings仍然是一个可变的List,只有参考的List是不可改变的.
小心这样的事情:
Collections.unmodifiableList(strings);
Run Code Online (Sandbox Code Playgroud)
Collections.unmodifiableList() JavaDoc提供了"不可修改的视图",但它仍然不能保证底层列表不能通过对List正在包装的原始文件的外部引用进行更改.列表内容的深层副本必须被制作成一个新列表,并且该列表包含在内unmodifiable.
每个物体的每一个例子以及他们所有的孩子和孩子的孩子也必须是不变的.