Java中的不变性

mak*_*aks 4 java

如果我的类将是一个不可变的类,它必须是final没有任何修改其状态的方法,并且所有属性必须是私有的.但为什么它应该声明为final(例如private final int a)?

编辑

如果类具有对不可变的对象的引用,那么该类仍然是不可变的吗?

duf*_*ymo 6

如果将私有成员变量标记为final,则需要使用编译器和运行时引擎来确保其值永远不会被类本身或其子类修改.


hvg*_*des 5

最后一类是不能被子类化的类.类定义的final关键字不一定使该类不可变.所以你的类不必是最终的,因为它的实例是不可变的(你的问题暗示你正在使类最终,注意final可以用来修改不仅仅是类).但是,如果您创建一个类final,该类不能被子类化,那么您可以保证不会创建任何可变子类.

不变性只是意味着不能改变课堂上的任何价值观.所以私人领域,没有非私人制定者应该这样做.一个常见的问题是,如果您的类具有Collection,则必须返回某种不可修改的集合,否则可以更改集合中的值,即使没有人可以更改对该集合的引用.这回答了你问题的第二部分.如果final myCollection在你的类上声明一个,你不能改变对myCollection的引用,但你仍然可以在类之外修改集合,如果你有一个getter(很好)并且不返回一个不可修改的集合.请参阅http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#unmodifiableCollection(java.util.Collection)

关于不变性,请记住,一旦最初设置了值,目标就是无法更改类的实例.使用final关键字可以提供帮助,但本身并不足以拥有不可变的定义.