When I\'m designing immutable objects, case classes are incredibly handy because of the auto-generated copy
method.
But case classes have their own problems
I don't know about a compiler plugin, but you can define a copy
method just like the one generated in case classes using named arguments in combination with default arguments.
class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
def copy(principalBalance: Double = principalBalance,
name: String = name,
endDate: LocalDate = endDate) = new Debt(principalBalance, name, endDate)
}
This is not as repetitive as separate methods for each property (withNewPrincipalBalance
) and makes it possible to disallow changes of certain values (for example the creation date).