Case class immutable 仍然可以改变参数值
Case class immutable still able to change the parameter values
我查看了一位同事的一些代码,发现了一个默认情况下不可变的案例 class。
下面的 case class 可以改变所以我的问题是这怎么可能因为 case classes 是不可变的但是在这个构造中我可以改变 case class 参数?
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
方法。这种结构有什么用?这种好的编码风格?
案例 class 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"))
我查看了一位同事的一些代码,发现了一个默认情况下不可变的案例 class。
下面的 case class 可以改变所以我的问题是这怎么可能因为 case classes 是不可变的但是在这个构造中我可以改变 case class 参数?
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
方法。这种结构有什么用?这种好的编码风格?
案例 class 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"))