"копировать" для классов, отличных от случая?
Когда я создаю неизменяемые объекты, классы классов невероятно удобны из-за автоматически сгенерированного метода copy
.
Но классы case имеют свои проблемы: они не должны унаследоваться, и они дают вам экстрактор, даже если вы этого не хотите.
Поэтому иногда мне приходится использовать класс сада Scala. Проблема в том, что тогда я должен написать свой собственный неизменяемый API, который может быть довольно повторяющимся:
class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
def withNewPrincipalBalance(bal: Double) = new Debt(bal, name, endDate)
}
Есть ли более масштабируемый способ сделать это? Могу ли я использовать плагин компилятора?
Ответы
Ответ 1
Я не знаю о плагине компилятора, но вы можете определить метод copy
, как и тот, который сгенерирован в классах case, используя именованные аргументы в сочетании с аргументами по умолчанию.
class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
def copy(principalBalance: Double = principalBalance,
name: String = name,
endDate: LocalDate = endDate) = new Debt(principalBalance, name, endDate)
}
Это не так повторяется, как отдельные методы для каждого свойства (withNewPrincipalBalance
) и позволяет запретить изменения определенных значений (например, дату создания).