Busqué en Google para encontrar las diferencias entre a case class
y a class
. Todos mencionan que cuando desea hacer una coincidencia de patrones en la clase, use la clase de caso. De lo contrario, use clases y también mencione algunas ventajas adicionales como equals y anulación de código hash. ¿Pero son estas las únicas razones por las que uno debería usar una clase de caso en lugar de una clase?
Supongo que debería haber alguna razón muy importante para esta característica en Scala. ¿Cuál es la explicación o hay un recurso para aprender más sobre las clases de casos Scala?
fuente
Técnicamente, no hay diferencia entre una clase y una clase de caso, incluso si el compilador optimiza algunas cosas al usar clases de caso. Sin embargo, se utiliza una clase de caso para eliminar la placa de caldera para un patrón específico, que está implementando tipos de datos algebraicos .
Un ejemplo muy simple de tales tipos son los árboles. Un árbol binario, por ejemplo, puede implementarse así:
Eso nos permite hacer lo siguiente:
Tenga en cuenta que los árboles construyen y deconstruyen (a través de la coincidencia de patrones) con la misma sintaxis, que también es exactamente cómo se imprimen (menos espacios).
Y también se pueden usar con mapas o conjuntos de hash, ya que tienen un hashCode válido y estable.
fuente
(Ya mencionaste todo menos el último).
Esas son las únicas diferencias con las clases regulares.
fuente
Nadie mencionó que las clases de casos también son instancias
Product
y, por lo tanto, heredan estos métodos:donde
productArity
devuelve el número de parámetros de clase,productElement(i)
devuelve el i ésimo parámetro yproductIterator
permite iterar a través de ellos.fuente
Nadie mencionó que las clases de caso tienen
val
parámetros de constructor, pero este también es el valor predeterminado para las clases regulares (lo que creo que es una inconsistencia en el diseño de Scala). Darío dio a entender tal cosa donde notó que son " inmutables ".Tenga en cuenta que puede anular el valor predeterminado al anteponer el argumento de cada constructor
var
para las clases de caso. Sin embargo, hacer clases de casos mutable hace que susequals
yhashCode
métodos para ser variable en el tiempo. [1]sepp2k ya mencionó que las clases de casos generan
equals
yhashCode
métodos automáticamente .Además, nadie mencionó que las clases de casos crean automáticamente un compañero
object
con el mismo nombre que la clase, que contieneapply
yunapply
métodos. Elapply
método permite construir instancias sin anteponernew
. Elunapply
método extractor permite la coincidencia de patrones que otros mencionaron.También el compilador optimiza la velocidad de
match
-case
coincidencia de patrones para las clases de casos [2].[1] Las clases de casos son geniales
[2] Clases de casos y extractores, pág . 15 .
fuente
La construcción de la clase de caso en Scala también se puede ver como una conveniencia para eliminar algunas repeticiones.
Al construir una clase de caso, Scala le ofrece lo siguiente.
apply
método que puede utilizar como método de fábrica. Obtiene la ventaja sintáctica del azúcar de no tener que usar la nueva palabra clave.Debido a que la clase es inmutable, obtienes accesores, que son solo las variables (o propiedades) de la clase pero no mutadores (por lo que no hay capacidad para cambiar las variables). Los parámetros del constructor están disponibles automáticamente para usted como campos públicos de solo lectura. Mucho más agradable de usar que la construcción de Java Bean.
hashCode
,equals
ytoString
métodos por defecto y elequals
método compara estructuralmente un objeto. Secopy
genera un método para poder clonar un objeto (con algunos campos que tienen nuevos valores proporcionados al método).La mayor ventaja, como se mencionó anteriormente, es el hecho de que puede emparejar patrones en las clases de casos. La razón de esto es porque obtienes el
unapply
método que te permite deconstruir una clase de caso para extraer sus campos.En esencia, lo que obtienes de Scala cuando creas una clase de caso (o un objeto de caso si tu clase no toma argumentos) es un objeto singleton que sirve como fábrica y como extractor .
fuente
copy
método puede modificar los campos:val x = y.copy(foo="newValue")
Además de lo que la gente ya ha dicho, hay algunas diferencias más básicas entre
class
ycase class
1.
Case Class
no necesita explícitonew
, mientras que la clase debe llamarse connew
2. Por los parámetros predeterminados de los constructores son privados en
class
, mientras que su público encase class
3.
case class
compararse por valorfuente
Según la documentación de Scala :
Otra característica de la palabra clave case es que el compilador genera automáticamente varios métodos para nosotros, incluidos los métodos familiares toString, equals y hashCode en Java.
fuente
Clase:
Pero si usamos el mismo código pero usamos la clase de caso:
Clase de persona:
La coincidencia de patrones:
objeto: singleton:
fuente
Para tener la mejor comprensión de lo que es una clase de caso:
supongamos la siguiente definición de clase de caso:
y luego haz lo siguiente en la terminal:
Scala 2.12.8 generará:
Como podemos ver, el compilador de Scala produce una clase regular
Foo
y un objeto complementarioFoo
.Repasemos la clase compilada y comentemos lo que tenemos:
Foo
clase, inmutable:scala.Product
rasgo de implementación :scala.Equals
rasgo de implementación para hacer instancias de clase de caso comparables para la igualdad mediante==
:java.lang.Object.hashCode
por obedecer el contrato equals-hashcode:java.lang.Object.toString
:new
palabra clave:Object Foo: - método
apply
para instanciación sinnew
palabra clave:unupply
para utilizar la clase de caso Foo en la coincidencia de patrones:scala.runtime.AbstractFunction2
por hacer tal truco:tupled
from object devuelve una función para crear un nuevo Foo aplicando una tupla de 2 elementos.Entonces, la clase de caso es solo azúcar sintáctico.
fuente
A diferencia de las clases, las clases de casos solo se utilizan para contener datos.
Las clases de casos son flexibles para aplicaciones centradas en datos, lo que significa que puede definir campos de datos en la clase de casos y definir la lógica de negocios en un objeto complementario. De esta manera, está separando los datos de la lógica empresarial.
Con el método de copia, puede heredar cualquiera o todas las propiedades requeridas del origen y puede cambiarlas a su gusto.
fuente
Nadie mencionó que el objeto complementario de la clase de caso tiene
tupled
defention, que tiene un tipo:El único caso de uso que puedo encontrar es cuando necesitas construir una clase de caso a partir de una tupla, por ejemplo:
Puede hacer lo mismo, sin tupled, creando un objeto directamente, pero si sus conjuntos de datos expresados como una lista de tuple con arity 20 (tuple con 20 elementos), puede usar tupled es su elección.
fuente
Una clase de caso es una clase que se puede usar con la
match/case
declaración.Ves eso
case
es seguido por una instancia de clase Fun cuyo segundo parámetro es un Var. Esta es una sintaxis muy buena y poderosa, pero no puede funcionar con instancias de ninguna clase, por lo tanto, existen algunas restricciones para las clases de casos. Y si se obedecen estas restricciones, es posible definir automáticamente hashcode e iguales.La vaga frase "un mecanismo de descomposición recursiva mediante la coincidencia de patrones" significa simplemente "funciona con
case
". (De hecho, la instancia seguida pormatch
se compara con (se compara con) la instancia que siguecase
, Scala tiene que descomponerlos a ambos, y tiene que descomponer recursivamente de qué están hechos.¿Para qué clases de casos son útiles? El artículo de Wikipedia sobre tipos de datos algebraicos ofrece dos buenos ejemplos clásicos, listas y árboles. La compatibilidad con los tipos de datos algebraicos (incluido saber cómo compararlos) es imprescindible para cualquier lenguaje funcional moderno.
¿Para qué clases de caso no son útiles? Algunos objetos tienen estado, el código como
connection.setConnectTimeout(connectTimeout)
no es para clases de casos.Y ahora puedes leer Un recorrido por Scala: Clases de casos
fuente
Creo que, en general, todas las respuestas han dado una explicación semántica sobre las clases y las clases de casos. Esto podría ser muy relevante, pero cada novato en scala debe saber qué sucede cuando crea una clase de caso. He escrito esta respuesta, que explica la clase de caso en pocas palabras.
Todos los programadores deben saber que si están utilizando funciones predefinidas, entonces están escribiendo un código comparativamente menor, lo que les permite dar el poder de escribir el código más optimizado, pero el poder conlleva grandes responsabilidades. Por lo tanto, use funciones preconstruidas con mucha precaución.
Algunos desarrolladores evitan escribir clases de casos debido a 20 métodos adicionales, que puede ver al desmontar el archivo de clase.
Consulte este enlace si desea verificar todos los métodos dentro de una clase de caso .
fuente
fuente
Algunas de las características clave de
case classes
se enumeran a continuaciónnew
palabra clave.Ejemplo de código scala en el violín scala, tomado de los documentos scala.
https://scalafiddle.io/sf/34XEQyE/0
fuente