[英]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.