2011-07-09 16 views
19

Cuando estoy diseñando objetos inmutables, las clases de casos son increíblemente prácticas debido al método autogenerado copy.'copia' para las clases que no son de casos?

Pero las clases de caso tienen sus propios problemas: no se deben heredar y le dan un extractor aunque no lo desee.

Así que a veces tengo que usar una variedad de jardín de la clase Scala. El problema es que luego tengo que escribir mi propia API inmutable, que puede ser bastante repetitivo:

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

¿Existe una manera más escalable para hacer esto? ¿Hay un complemento de compilación que pueda usar?

+2

ver http://stackoverflow.com/q/3900307/203968 – oluies

Respuesta

31

No conozco un complemento de compilación, pero puede definir un método copy como el que se genera en las clases de casos utilizando argumentos con nombre en combinación con los argumentos predeterminados.

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

Esto no es tan repetitivo como métodos separados para cada propiedad (withNewPrincipalBalance) y hace que sea posible para no permitir cambios en ciertos valores (por ejemplo, la fecha de creación).

Cuestiones relacionadas