Ma rację - nie trzeba mieć obiektu sprawy, aby móc na nim dopasować wzór. Myślę, że nie zostało to rozwiązane w poprzednim pytaniu ...
axel22,
3
Myślałem, że będzie różnica w zachowaniu dopasowania wzorca, ale zarówno obiekt sprawy, jak i obiekt normalny zachowują się w ten sam sposób w dopasowaniu wzorca AFAIK. Trudno jest znaleźć jakiekolwiek informacje na temat obiektów sprawy, więc nie mogę się doczekać, aby ktoś nas oświecił.
Wiek Mooij,
4
caseAby dopasować wzór, nie trzeba go używać , to tylko cukier. Wcielanie unapplysię w życie wykonuje zadanie.
Raphael
1
Przyjęta odpowiedź po prostu nie odpowiada na pytanie, jak omówiono w komentarzach do niego. Zbyt późno, aby coś zmienić, ale należy to zauważyć.
itsbruce
Nie jest za późno na edycję zaakceptowanej odpowiedzi. Edycja zostanie sprawdzona i, w razie potrzeby, zaakceptowana.
C4stor
Odpowiedzi:
111
Klasy przypadków różnią się od klas zwykłych tym, że otrzymują:
obsługa dopasowywania wzorców
domyślne implementacje equalsihashCode
domyślne implementacje serializacji
ładniejsza domyślna implementacja toStringi
niewielka ilość funkcji, które otrzymują po automatycznym dziedziczeniu scala.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.
Punkty 3 i 4 tej odpowiedzi to poprawna różnica między obiektami sprawy i obiektami. Punkty 1 i 2 nie mają znaczenia dla obiektów singletonowych. A obiekty singletonowe są zawsze Produktami o arity 0, więc punkt 5 również nie ma znaczenia.
Wojciech Durczyński
86
Ten post utrwala mit, który 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.
nilskp
66
Pytanie dotyczy case objectnie klasy, dlaczego to poprawna odpowiedź?
Ixx
10
To nie odpowiada na pytanie. Ta odpowiedź dotyczy różnicy między case classa class. Pytanie dotyczy różnicy między case objecti object.
MK
6
@ C4stor Odpowiedź jednak tego nie mówi. Obiekt nie jest klasą. Biorąc pod uwagę, że klasy przypadków wykonują spore ilości magii za kulisami, biorąc pod uwagę różne przypadki krawędzi i komplikacje, nie ma powodu po prostu zakładać, że jedyna różnica między standardowym obiektem Scali a obiektem przypadku jest wyjaśniona przez to, co wiemy o różnicy między klasami standardowymi a klasami spraw. Ta odpowiedź nawet nie odnosi się do sformułowania pytania.
itsbruce
137
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>caseobject B
defined module B
scala>import java.io._
import java.io._
scala>val bos =newByteArrayOutputStream
bos: java.io.ByteArrayOutputStream=
scala>val oos =newObjectOutputStream(bos)
oos: java.io.ObjectOutputStream= java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
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.
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.
case
Aby dopasować wzór, nie trzeba go używać , to tylko cukier. Wcielanieunapply
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.źródło
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
aclass
. Pytanie dotyczy różnicy międzycase object
iobject
.Oto jedna różnica - obiekty przypadku rozszerzają tę
Serializable
cechę, aby można je było serializować. Zwykłe obiekty nie mogą domyślnie:źródło
extends Serializable
powinno jednak zrobić tę samą sztuczkę.Różnica w serializacji:
toString różnica:
źródło
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.
źródło
Podobnie jest z
case class
iclass
, używamycase object
zamiast tego,case class
gdy nie ma żadnych pól reprezentujących dodatkowe informacje o stanie.źródło
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.
źródło