Reputation: 13088
I suppose the obvious solution is to call .clone.copy
everywhere, but there are certain applications where calling .copy
without .clone
might be dangerous or hard to debug.
This seems to demonstrate that clone
(or the overridden clone
), is not used by 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)
Upvotes: 0
Views: 315
Reputation: 22477
You could provide your own copy method:
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)
}
In which case, you won't get the "free" copy
method provided by Scala, but you can still avoid implementing your own equals
, hashCode
and companion object apply
, unapply
etc.
Upvotes: 2