我查看了一位同事的一些代码,然后遇到了一个案例类,默认情况下它是不可变的。

下面的案例类可以更改,所以我的问题是,既然案例类是不可变的,那怎么可能呢?但是在这种结构中,我可以更改案例类的参数?

case class RegisterCustomerRequest(`first-name`: String,
                                   `last-name`: String,
                                   `house-details`: String,
                                   street: String,
                                   zipcode: String,
                                   city: String

    extends WcRequestData {

    def this(cardHolderData: CardHolderData,
           registrationCode: RegistrationCode,
           customerNumber: Long,
           cardDesignImageId: String) =
    this(`first-name` = cardHolderData.firstname,
         `last-name` = cardHolderData.lastname,
          street = cardHolderData.streetAndNumber,
          zipcode = cardHolderData.zipCode,
          city = cardHolderData.city,


       #   `house-details` =
          s"${if (cardHolderData.employerName.contains("&"))
          cardHolderData.employerName.replace("&" , " & ") else " /
           "}${cardHolderData.employerName} ")#
    }

为什么我要定义一个def this方法,该方法可以更改参数的值。这种良好的编码风格对该结构有什么好处?

最佳答案

案例类RegisterCustomerRequest仍然是不可变的,但是它具有auxiliary constructor def this,可以用其他方式构造它。例如,给定

case class User(name: String)

case class Foo(name: String) {
  def this(user: User) {
    this(name = user.name)
  }
}

我们可以像这样构造Foo
Foo("picard")

或使用辅助构造函数
new Foo(User("picard"))

在这两种情况下,结果都是不可变的对象。要确认不变性,请在构造后尝试重新分配name
(new Foo(User("picard"))).name = "worf" // Error: reassignment to val

如som-snytt所建议,我们可以在伴侣对象上定义apply方法,而不是像这样的辅助构造方法
object Foo {
  def apply(user: User): Foo = Foo(user.name)
}

这可以进行以下构造
Foo(User("picard"))

关于scala - 案例类不可变,仍然能够更改参数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56613999/

10-11 18:04