¿Hay alguna diferencia entre objeto de caso y objeto en scala?
casepara tener una coincidencia de patrones, es solo azúcar. Implementarte a unapplyti mismo hace el trabajo.
¿Hay alguna diferencia entre objeto de caso y objeto en scala?
casepara tener una coincidencia de patrones, es solo azúcar. Implementarte a unapplyti mismo hace el trabajo.
Respuestas:
Las clases de casos difieren de las clases regulares en que obtienen:
equalsyhashCodetoString, 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 toStringmétodo y algunos métodos que probablemente nunca usará.
objectes 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 objecta 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 objectno clase, ¿por qué es esta la respuesta correcta?
case classy a class. La pregunta es sobre la diferencia entre case objecty object.
Aquí hay una diferencia: los objetos de caso extienden el Serializablerasgo, 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 Serializableembargo, 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.