不可变对象是创建后不能修改的对象。
不可变对象有两个很大的优点:
- 基于不可变对象的代码更清晰,也更可能是正确的。涉及到意外更改的错误是不会发生的。
- 多个线程可以安全地并发访问不可变对象。
在Lagom中,一些地方需要不可变对象,例如:
- 服务请求和响应
- 持久化实体命令、事件和状态
-
可变 vs 不可变
class MutableUser {private var name: String = nullprivate var email: String = nulldef getName: String = namedef setName(name: String): Unit =this.name = namedef getEmail: String = emaildef setEmail(email: String): Unit =this.email = email}
构造之后setter方法可以修改对象。
相反,这里是一个不可变对象:final case class ImmutableUser(name: String, email: String)
所有属性在构造时被指定为不可变的,没有setter方法。
如您所见,Scala的case class对于编写不可变类非常方便。
注意,不可变类包含的成员也必须是不可变的。Scala有很好的不可变集合,您应该在不可变类中使用它们。请注意,scala.collection.Seq不保证是不可变的。相反,您应该使用scala.collection.immutable.Seq或其他不可变实现,如List或Vector。
