Czy jest jakaś różnica między obiektem sprawy a obiektem w scali?
caseAby dopasować wzór, nie trzeba go używać , to tylko cukier. Wcielanie unapplysię w życie wykonuje zadanie.
Czy jest jakaś różnica między obiektem sprawy a obiektem w scali?
caseAby dopasować wzór, nie trzeba go używać , to tylko cukier. Wcielanie unapplysię w życie wykonuje zadanie.
Odpowiedzi:
Klasy przypadków różnią się od klas zwykłych tym, że otrzymują:
equalsihashCodetoStringiscala.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 toStringi niektóre metody, których prawdopodobnie nigdy nie użyjesz.
objectjest taki sam jak singleton. Nie jest. Raczej jest dokładnie tym, co mówi, jest przedmiotem, tj. Deklaracją i instancją w jednym. Ogranicza się objectdo 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 objectnie klasy, dlaczego to poprawna odpowiedź?
case classa class. Pytanie dotyczy różnicy między case objecti object.
Oto jedna różnica - obiekty przypadku rozszerzają tę Serializablecechę, 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 Serializablepowinno 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 classi class, używamy case objectzamiast tego, case classgdy 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.