不可变对象是创建后不能修改的对象。
不可变对象有两个很大的优点:

  • 基于不可变对象的代码更清晰,也更可能是正确的。涉及到意外更改的错误是不会发生的。
  • 多个线程可以安全地并发访问不可变对象。

在Lagom中,一些地方需要不可变对象,例如:

  • 服务请求和响应
  • 持久化实体命令、事件和状态
  • 发布和订阅消息

    可变 vs 不可变

    1. class MutableUser {
    2. private var name: String = null
    3. private var email: String = null
    4. def getName: String = name
    5. def setName(name: String): Unit =
    6. this.name = name
    7. def getEmail: String = email
    8. def setEmail(email: String): Unit =
    9. this.email = email
    10. }

    构造之后setter方法可以修改对象。
    相反,这里是一个不可变对象:

    1. final case class ImmutableUser(name: String, email: String)

    所有属性在构造时被指定为不可变的,没有setter方法。
    如您所见,Scala的case class对于编写不可变类非常方便。

注意,不可变类包含的成员也必须是不可变的。Scala有很好的不可变集合,您应该在不可变类中使用它们。请注意,scala.collection.Seq不保证是不可变的。相反,您应该使用scala.collection.immutable.Seq或其他不可变实现,如ListVector