需要我让所有类都不可变吗?

MyT*_*tle 4 java immutability effective-java

我读了Effective Java,并写了

如果一个类不能成为不可变的,尽可能地限制它的可变性......

......除非有令人信服的理由使其成为非最终的,否则每个领域都是最终的.

所以需要我总是让我所有的POJO(例如简单的Book带班ID,TitleAuthor域)班不变?当我想要改变我的对象的状态时(例如用户在代表很多书的表中更改它),而不是setter使用这样的方法:

public Book changeAuthor(String author) {
   return new Book(this.id, this.title, author);  //Book constructor is private
}
Run Code Online (Sandbox Code Playgroud)

但我的事情真的不是好主意..

请解释我何时使类不可变.

Tho*_*rig 6

不,您不需要总是让您的POJO不可变.就像你说的,有时它可能是一个坏主意.如果您的对象具有随时间变化的属性,则设置器是最舒适的方式.

但是你应该考虑使你的对象不可变.它将帮助您找到错误,更清晰地编程并处理并发.

但我认为你引用说的一切:

如果一个类不能成为不可变的,尽可能地限制它的可变性......

......除非有令人信服的理由使其成为非最终的,否则每个领域都是最终的.

这就是你应该做的.除非它不可能,因为你有一个二传手.但是要注意并发性.