scala - sirve - tesis sobre youtube pdf
Diferencia entre objeto de caso y objeto. (5)
¿Hay alguna diferencia entre el objeto de caso y el objeto en Scala?
Aquí hay una diferencia: los objetos de caso extienden el rasgo Serializable
, por lo que pueden ser serializados. Los objetos regulares 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$
Es similar con la case class
y la class
, solo usamos el case object
de case class
lugar de la case class
de case class
cuando no hay campos que representen información de estado adicional.
Las clases de casos difieren de las clases regulares en que obtienen:
- soporte de coincidencia de patrones
- implementaciones por defecto de
equals
yhashCode
- implementaciones por defecto de serialización
- una implementación por defecto más bonita de
toString
, y - la pequeña cantidad de funcionalidad que obtienen al heredar automáticamente de
scala.Product
.
La coincidencia de patrones, los iguales y el código hash no importan mucho para los singletons (a menos que hagas algo realmente degenerado), por lo que simplemente obtienes una serialización, una buena toString
y algunos métodos que probablemente nunca usarás.
los objetos de caso vienen implícitamente con implementaciones de métodos toString, equals y hashCode, pero los objetos simples no lo hacen. los objetos de caso pueden ser serializados mientras que los objetos simples no pueden ser serializados, lo que hace que los objetos de caso sean muy útiles como mensajes con Akka-Remote. Agregar la palabra clave del caso antes de la palabra clave del objeto hace que el objeto sea serializable.
scala> object foo
objeto definido foo
scala> case object foocase
objeto definido para foocase
Diferencia de serialización:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ no se puede convertir a scala.Serializable
... 43 elidido
scala> foocase.asInstanceOf[Serializable]
res1: serializable = foocase
aString diferencia:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase