usabilidad tipo sitios para paginas orientadas medidas informatica evolucion elementos ejemplos discapacitados definicion accesibles accesibilidad scala

scala - para - tipo de medidas orientadas a la accesibilidad en sitios web



Cuándo usar la clase de caso o la clase regular (6)

  1. Cuando su clase tiene un estado mutable, no use clases de casos.
  2. Cuando desee la igualdad estructural, utilice una clase de caso, ya que le da el hashCode adecuado y equals . Por ejemplo, desea poder usarlos como claves en un Set o Map

Aquí hay otra preferencia más personal:

  • Cuando simplemente quiere getters automáticos, y coloca instancias en un Set o Map , pero solo tiene una instancia y no requiere igualdad estructural, prefiera la class Foo(val i: Int) sobre la case class Foo(i: Int) , porque no tiene posiblemente controles de igualdad más caros.

Si 1. y 2. colisionan, puede implementar funciones específicas de clase de caso a mano. Por ejemplo, proporcione un método de apply complementario o un extractor de coincidencia de patrones para una clase mutable que no sea de caso.

Tengo algunos malentendidos en los casos en los que debería usar la clase de casos o el seguimiento regular de clases con las mejores prácticas. Ya he leído sobre las diferencias de ambas clases, pero no puedo imaginarme ejemplos de la vida real en los que se recomiende el uso de mayúsculas o minúsculas.

¿Alguien podría mostrarme ejemplos reales con una explicación de por qué se recomienda hacerlo y no de otra manera?


Las clases normales son clases como clases en Java. Puede contener tanto estado como funcionalidad.
Las clases de casos son como datos POJO en Java. clases que mantienen el estado, que pueden ser utilizadas por funciones (generalmente en otras clases).

Cuando implemente datos POJO en Java, debe establecer la variable que contiene, agregar getter y setter para ellos, implementar hashcode y equals, y probablemente implementar toString.
Por lo general, no es tan malo, ya que después de definir las variables, el IDE puede generar todo para usted, pero si cambia / agrega variables, entonces debe recordar actualizar todos los métodos.
en las clases de casos, usted define las variables (o mejores valores) y el compilador genera todos los métodos por usted. Así que obtienes ambos, sin repetición y funcionalidad actualizada.
Para las clases de casos, el compilador también genera más funcionalidades, que no puede y no puede tener en Java, la función de copia y aplicar / deshacer aplicación en el objeto de comparación.


Si va a escribir código puramente funcional con objetos inmutables, intente evitar el uso de clases regulares. La idea principal del paradigma funcional es la separación de las estructuras de datos y las operaciones sobre ellos. Las clases de casos son una representación de una estructura de datos con los métodos necesarios. Las funciones de los datos se deben describir en diferentes entidades de software (p. Ej., Rasgos, objetos).

Las clases regulares, por el contrario, vinculan datos y operaciones para proporcionar la mutabilidad. Este enfoque está más cerca del paradigma orientado a objetos.

Como resultado, no use clases de casos si:

  1. Tu clase tiene un estado mutable.
  2. Tu clase incluye algo de lógica.
  3. Tu clase no es una representación de datos y no necesitas igualdad estructural.

Sin embargo, en estos casos, debería pensar realmente en el estilo de su código porque probablemente no sea lo suficientemente funcional.


Una clase de caso le ofrece implementaciones "libres" (es decir, no tiene que escribir) de equals , hashcode y toString , así como apply y unapply en el objeto complementario. Básicamente, puede pensar en una clase de caso como una tupla nombrada , cuyos campos también se nombran.

Para cualquier otra cosa, es mejor que uses una clase normal.


las clases de casos son datacentric.

Obtenemos las siguientes ventajas al usar la clase de caso sobre las clases regulares.

(1) Equivalencia de valor: significa que dos instancias de caso se pueden comparar con valores dentro de ellas.

scala> case class Time(hours: Int = 0, mins: Int = 0) defined class Time scala> val time1 = Time(12, 13) time1: Time = Time(12,13) scala> val time2 = Time(11, 12) time2: Time = Time(11,12) scala> time1 == time2 res6: Boolean = false scala> val time3 = Time(10, 11) time3: Time = Time(10,11) scala> time1 == time2 res7: Boolean = false

Pero otros operadores de comparación (>,> = <, etc.) no están definidos.

(2) Campos inmutables: Thread-safe

(3) Creación automática de campos: las horas y los minutos son campos inmutables creados automáticamente por Scala.

scala> time1.hours res9: Int = 12

Las clases de caso también se utilizan en el análisis de las filas de DataFrame de chispa y la ventaja es que se puede acceder a las columnas de DataFrame por nombre de campo de clase de caso.


Las clases de casos son clases normales con azúcar sintáctico. Entonces, no hay una gran diferencia, puedes hacer todo con una clase de caso que puedes hacer con una clase y viceversa.

Las clases de casos solo le ahorran mucho código de placa de caldera para escribir.

El ajuste perfecto, como su nombre lo sugiere, es el uso de clases de casos en la coincidencia de patrones con el case .

case class MyCase(name: String, age: Int) data : List[MyCase] = ... data foreach { case MyCase(_, age) if age > 21 => println("old enough") case MyCase("fred", _ ) => println("Got you") case _ => ... }