簡體   English   中英

java.util.UUID.randomUUID 是否可復制?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM