Czy jest jakaś różnica między obiektem sprawy a obiektem w scali?
case
Aby dopasować wzór, nie trzeba go używać , to tylko cukier. Wcielanie unapply
się w życie wykonuje zadanie.
Czy jest jakaś różnica między obiektem sprawy a obiektem w scali?
case
Aby dopasować wzór, nie trzeba go używać , to tylko cukier. Wcielanie unapply
się w życie wykonuje zadanie.
Odpowiedzi:
Klasy przypadków różnią się od klas zwykłych tym, że otrzymują:
equals
ihashCode
toString
iscala.Product
. Dopasowywanie wzorców, equals i hashCode nie mają większego znaczenia dla singletonów (chyba że zrobisz coś naprawdę zdegenerowanego), więc właściwie otrzymujesz serializację, fajne toString
i niektóre metody, których prawdopodobnie nigdy nie użyjesz.
object
jest taki sam jak singleton. Nie jest. Raczej jest dokładnie tym, co mówi, jest przedmiotem, tj. Deklaracją i instancją w jednym. Ogranicza się object
do pojedynczej instancji, jeśli jest zdefiniowana w zakresie pakietu, co skutecznie czyni ją singletonem, ale tylko jeśli jest zdefiniowana W TYM ZAKRESIE. Jeśli zdefiniowane w klasie, możesz mieć tyle instancji, co samą klasę (jest ona leniwie utworzona, więc niekoniecznie jest to 1-1). Te wewnętrzne obiekty mogą równie dobrze być używane jako klucze skrótu, co sprawia, że domyślny equals / hashCode jest bardzo sensowny.
case object
nie klasy, dlaczego to poprawna odpowiedź?
case class
a class
. Pytanie dotyczy różnicy między case object
i object
.
Oto jedna różnica - obiekty przypadku rozszerzają tę Serializable
cechę, aby można je było serializować. Zwykłe obiekty nie mogą domyślnie:
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
powinno jednak zrobić tę samą sztuczkę.
scala> object foo
zdefiniowany obiekt foo
scala> case object foocase
obiekt zdefiniowany
Różnica w serializacji:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: nie można przesłać foo $ do scala.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: Serializable = foocase
toString różnica:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
obiekty case domyślnie pochodzą z implementacji metod toString, equals i hashCode, ale proste obiekty nie. obiekty sprawy mogą być serializowane, podczas gdy proste obiekty nie, co sprawia, że obiekty sprawy są bardzo przydatne jako wiadomości z Akka-Remote. Dodanie słowa kluczowego case przed słowem kluczowym object powoduje, że obiekt może być serializowany.
Podobnie jest z case class
i class
, używamy case object
zamiast tego, case class
gdy nie ma żadnych pól reprezentujących dodatkowe informacje o stanie.
Wcześniej znamy obiekty i „klasę przypadków”. Ale „obiekt sprawy” jest mieszanką obu, tzn. Jest singletonem podobnym do obiektu i z dużą ilością płyty kotłowej, jak w przypadku klasy spraw. Jedyna różnica polega na tym, że płyta kotłowa jest wykonywana dla obiektu zamiast klasy.
obiekty case nie będą dostarczane z następującymi:
Zastosuj, Cofnij metody. tutaj nie ma metod kopiowania, ponieważ jest to singleton. Brak metody porównania równości strukturalnej. Nie ma też konstruktora.