Подтвердить что ты не робот

"копировать" для классов, отличных от случая?

Когда я создаю неизменяемые объекты, классы классов невероятно удобны из-за автоматически сгенерированного метода copy.

Но классы case имеют свои проблемы: они не должны унаследоваться, и они дают вам экстрактор, даже если вы этого не хотите.

Поэтому иногда мне приходится использовать класс сада Scala. Проблема в том, что тогда я должен написать свой собственный неизменяемый API, который может быть довольно повторяющимся:

class Debt(principalBalance: Double, name: String, endDate: LocalDate) {
  def withNewPrincipalBalance(bal: Double) = new Debt(bal, name, endDate)
}

Есть ли более масштабируемый способ сделать это? Могу ли я использовать плагин компилятора?

4b9b3361

Ответ 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) и позволяет запретить изменения определенных значений (например, дату создания).