Как получить "копию" класса дел для использования переопределенного "клона"?

Я полагаю, очевидным решением является вызов .clone.copy везде, но есть определенные приложения, где звонят .copy без .clone может быть опасным или трудным для отладки.

Это, кажется, демонстрирует, что clone (или переопределенный clone), не используется copy:

class Process {
  def replicate: Process = {
    println("Hello from Process.replicate")
    new Process()
  }
}

final case class Processes(
  process1: Process,
  process2: Process
) {
  override def clone: Processes = Processes(
    process1.replicate, process2.replicate)
}

val origProcesses = Processes(new Process, new Process)
val clonedProcesses = origProcesses.copy(process1 = new Process)

1 ответ

Решение

Вы можете предоставить свой собственный метод копирования:

final case class Processes(
  process1: Process,
  process2: Process
) {
  override def clone: Processes = Processes(
    process1.replicate, process2.replicate)
  def copy(process1: Process = this.process1.replicate, process2: Process = this.process2.replicate): Processes = Processes(
    process1, process2)
}

В этом случае вы не получите "бесплатно" copy метод, предоставляемый Scala, но вы все равно можете избежать реализации своего собственного equals, hashCode и сопутствующий объект apply, unapply и т.п.

Другие вопросы по тегам