[英]Is java.util.UUID.randomUUID copyable?
我有一个关于是否可以在java.util.UUID.randomUUID
定义的字段上执行 scala case 类复制(或克隆)的问题。
假设我的班级设置为
case class X(){
val id = java.util.UUID.randomUUID.toString()
}
我创建了一个 X 实例并尝试克隆该类。 我注意到的是 id 字段是不同的。 这是预期的,如果是,有没有办法确保所有复制/克隆方法返回相同的 id 值?
val z = X()
z.id != z.copy().id
问题不在于它是一个UUID
,问题在于您滥用/误解了案例类的工作方式。
案例类的copy
方法只是对类的构造函数的方便调用。 所以例如
final case class Foo(a: Int, b: String)
由编译器扩展为如下所示:
final class Foo(val a: Int, val b: String) {
def copy(a: Int = this.a, b: String = this.b): Foo =
new Foo(a, b)
// A bunch of other methods.
}
object Foo extends (Int, String) => Foo {
override def apply(a: Int, b: String): Foo =
new Foo(a, b)
// A bunch of other methods.
}
因此,正如您所看到的, copy
不是黑魔法,它只是一个带有默认参数的简单方法。
所以案例类的主体中没有任何内容包含在副本中,因此在您的代码中,将为每个实例创建id
字段作为对java.util.UUID.randomUUID.toString()
的调用
最好是这样做:
final case class X(id: String = java.util.UUID.randomUUID.toString)
这样你可以在创建时省略它,但它会被copy
保留。 您可以将它移动到参数列表的末尾,这样在创建它时就不需要总是使用命名参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.