2011-01-08 12 views
7

Estoy definiendo una clase Scala hoy, y creo que "necesito un método equals y un método hashCode, y un método copy sería útil también. Convertiré esto en una clase de caso". Mi clase ya tiene muchos otros códigos, y de ninguna manera es trivial.¿Es apropiado definir una clase de caso Scala no trivial?

Tan bien, todo funciona y todo, pero cuando los libros de texto tratan con clases de casos, todos los ejemplos los definen para su uso como clases de valor u 'objetos de transferencia de datos'. ¿Es apropiado definir una clase de caso no trivial? ¿Está bien el proceso de pensamiento descrito anteriormente, o tengo que pensar en las clases de casos de manera diferente?

+0

En realidad, la respuesta de Daniel Sobral es más detallada y probablemente deberías aceptarla en lugar de la mía. –

+0

Haré, Alexey. Gracias. – David

Respuesta

9

A case class proporciona, equals, hashCode y toString métodos basados ​​en los principales parámetros del constructor, todos los cuales se convierten en val también. Además, el objeto compañero obtiene un apply y un unapply métodos, de nuevo en función de los principales parámetros del constructor.

Además, case class hereda de Serializable y de Product, y no debe extenderse por otras clases.

Si todas estas cosas son apropiadas para su clase, entonces no dude en declararla como una 'clase de caso'.

+0

¿Puede explicar por qué las clases de casos no deberían extenderse? – Jus12

+0

@ Daniel: No importa. Encontré la respuesta en http://scala-programming-language.1934581.n4.nabble.com/scala-Do-you-use-case-class-inheritance-td2001640.html – Jus12

6

Siéntase libre, siempre que no tenga descendencia. La ampliación de las clases de casos es una mala idea.

+3

Y está en desuso. scala> case class Bar (invalidar val x: String) extiende Foo ("Some string") : 7: advertencia: caso clase 'clase Bar 'tiene caso clase ancestro' clase Foo'. Esto ha sido desaprobado por complicar indebidamente tanto el uso como la implementación. En su lugar, debe utilizar extractores para la coincidencia de patrones en nodos de hoja. caja clase Bar (invalidar val x: String) extends Foo ("Some string") – Janx

Cuestiones relacionadas