¿Hay alguna diferencia entre objeto de caso y objeto en scala?
case
para tener una coincidencia de patrones, es solo azúcar. Implementarte a unapply
ti mismo hace el trabajo.
¿Hay alguna diferencia entre objeto de caso y objeto en scala?
case
para tener una coincidencia de patrones, es solo azúcar. Implementarte a unapply
ti mismo hace el trabajo.
Respuestas:
Las clases de casos difieren de las clases regulares en que obtienen:
equals
yhashCode
toString
, yscala.Product
. La coincidencia de patrones, igual y hashCode no importan mucho para los singletons (a menos que haga algo realmente degenerado), por lo que está obteniendo la serialización, un buen toString
método y algunos métodos que probablemente nunca usará.
object
es lo mismo que un singleton. No lo es. Más bien es exactamente lo que dice que es, un objeto, es decir, una declaración y una instanciación en uno. Esto se limita object
a una sola instancia si se define en el alcance del paquete, lo que efectivamente lo convierte en un singleton, pero solo si se define EN ESE ALCANCE. Si se define dentro de una clase, puede tener tantas instancias como la clase en sí (se crea una instancia perezosa, por lo que no es necesariamente 1-1). Y esos objetos internos pueden muy bien ser utilizados como claves hash, haciendo que el valor predeterminado equals / hashCode sea muy sensible.
case object
no clase, ¿por qué es esta la respuesta correcta?
case class
y a class
. La pregunta es sobre la diferencia entre case object
y object
.
Aquí hay una diferencia: los objetos de caso extienden el Serializable
rasgo, por lo que pueden serializarse. Los objetos normales no pueden por defecto:
scala> object A
defined module A
scala> case object B
defined module B
scala> import java.io._
import java.io._
scala> val bos = new ByteArrayOutputStream
bos: java.io.ByteArrayOutputStream =
scala> val oos = new ObjectOutputStream(bos)
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
extends Serializable
embargo, agregar debería hacer el mismo truco.
scala> object foo
objeto definido foo
scala> case object foocase
foocase objeto definido
Diferencia de serialización:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ no se puede convertir a scala.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: Serializable = foocase
toString diferencia:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
Los objetos de caso vienen implícitamente con implementaciones de métodos toString, equals y hashCode, pero los objetos simples no. los objetos de caso se pueden serializar mientras que los objetos simples no, lo que hace que los objetos de caso sean muy útiles como mensajes con Akka-Remote. Agregar la palabra clave case antes de la palabra clave object hace que el objeto sea serializable.
Conocemos objetos y "clase de caso" antes. Pero "objeto de caso" es una mezcla de ambos, es decir, es un singleton similar a un objeto y con una gran cantidad de repeticiones como en una clase de caso. La única diferencia es que el repetitivo se realiza para un objeto en lugar de una clase.
los objetos de caso no vendrán con los siguientes:
Aplicar, no aplicar métodos. Aquí no hay métodos de copia ya que es un singleton No hay método para la comparación de igualdad estructural. Ningún constructor también.