不可变对象是创建后不能修改的对象。
不可变对象有两个很大的优点:
- 基于不可变对象的代码更清晰,也更可能是正确的。涉及到意外更改的错误是不会发生的。
- 多个线程可以安全地并发访问不可变对象。
在Lagom中,一些地方需要不可变对象,例如:
- 服务请求和响应
- 持久化实体命令、事件和状态
-
可变 vs 不可变
class MutableUser {
private var name: String = null
private var email: String = null
def getName: String = name
def setName(name: String): Unit =
this.name = name
def getEmail: String = email
def 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
。