Szukałem w Google, aby znaleźć różnice między case class
a a class
. Wszyscy wspominają, że jeśli chcesz wykonać dopasowanie wzorców w klasie, użyj klasy case. W przeciwnym razie użyj klas, a także wspominając o dodatkowych korzyściach, takich jak równość i zastępowanie kodu skrótu. Ale czy są to jedyne powody, dla których należy używać klasy case zamiast klasy?
Myślę, że powinien istnieć jakiś bardzo ważny powód tej funkcji w Scali. Jakie jest wyjaśnienie lub czy istnieje zasób, z którego można dowiedzieć się więcej o klasach przypadków Scala?
źródło
Technicznie nie ma różnicy między klasą a klasą spraw - nawet jeśli kompilator optymalizuje niektóre rzeczy podczas używania klas spraw. Jednak klasa przypadków służy do usuwania płyty kotła dla określonego wzorca, który implementuje algebraiczne typy danych .
Bardzo prostym przykładem takich typów są drzewa. Na przykład drzewo binarne można zaimplementować w następujący sposób:
Dzięki temu możemy wykonać następujące czynności:
Zauważ, że drzewa konstruują i dekonstruują (poprzez dopasowanie wzorca) przy użyciu tej samej składni, co jest dokładnie tak, jak są drukowane (bez spacji).
Można ich również używać z mapami lub zestawami skrótów, ponieważ mają one prawidłowy, stabilny kod skrótu.
źródło
(Wspomniałeś już o wszystkich oprócz ostatniego).
To jedyne różnice w stosunku do zwykłych klas.
źródło
Nikt nie wspominał, że klasy przypadków są również instancjami
Product
i dlatego dziedziczą następujące metody:gdzie
productArity
zwraca liczbę parametrów klasy,productElement(i)
zwraca i- ty parametr iproductIterator
umożliwia iterację przez nie.źródło
Nikt nie wspominał, że klasy przypadków mają
val
parametry konstruktora, ale jest to również domyślne dla klas regularnych (co moim zdaniem jest niespójne w projektowaniu Scali). Dario sugerował, że tam, gdzie zauważył, są „ niezmienni ”.Uwaga: możesz zastąpić wartość domyślną, wstawiając argument każdego konstruktora
var
dla klas spraw. Jednak, dzięki czemu zajęcia przypadków zmienny powoduje ichequals
andhashCode
metod być wariant czas. [1]sepp2k już wspomniał, że klasy spraw automatycznie generują
equals
ihashCode
metody.Nikt też nie wspomniał, że klasy przypadków automatycznie tworzą towarzysza
object
o tej samej nazwie co klasa, która zawieraapply
iunapply
metody. Taapply
metoda umożliwia konstruowanie instancji bez konieczności wcześniejszego korzystania z nichnew
. Metodaunapply
ekstraktora umożliwia dopasowanie wzorca, o którym wspominali inni.Również kompilator optymalizuje prędkość
match
-case
dopasowanie wzorca dla klas przypadków [2].[1] Klasy przypadków są fajne
[2] Klasy przypadków i ekstraktory, str . 15 .
źródło
Konstrukcja klasy skrzynek w Scali może być również postrzegana jako wygoda do usunięcia płyty kotłowej.
Podczas konstruowania klasy skrzynek Scala daje następujące informacje.
apply
metodę, której można użyć jako metody fabrycznej. Zaletą cukru syntaktycznego jest brak konieczności używania nowego słowa kluczowego.Ponieważ klasa jest niezmienna, dostajesz akcesoria, które są tylko zmiennymi (lub właściwościami) klasy, ale nie mają mutatorów (więc nie ma możliwości zmiany zmiennych). Parametry konstruktora są automatycznie dostępne jako publiczne pola tylko do odczytu. O wiele ładniejszy w użyciu niż Java Bean.
hashCode
,equals
oraztoString
metody domyślnie iequals
metoda porównuje obiektu strukturalnie.copy
Metoda jest generowany, aby móc sklonować obiektu (z niektóre pola posiadające nowe wartości podane metody).Największą zaletą, jak wspomniano wcześniej, jest fakt, że można dopasowywać wzorce do klas przypadków. Powodem tego jest to, że otrzymujesz
unapply
metodę, która pozwala zdekonstruować klasę przypadków w celu wyodrębnienia jej pól.Zasadniczo to, co otrzymujesz od Scali podczas tworzenia klasy sprawy (lub obiektu sprawy, jeśli twoja klasa nie przyjmuje argumentów), jest obiektem singleton, który służy temu celowi jako fabryka i jako ekstraktor .
źródło
copy
metoda może modyfikować pola:val x = y.copy(foo="newValue")
Oprócz tego, co ludzie już powiedzieli, istnieją pewne podstawowe różnice między
class
icase class
1.
Case Class
nie wymaga jawnegonew
, podczas gdy klasa musi być wywoływana za pomocąnew
2. Domyślne parametry konstruktora są prywatne w
class
, a jego publiczne wcase class
3.
case class
porównać się pod względem wartościźródło
Zgodnie z dokumentacją Scali :
Inną cechą słowa kluczowego case jest to, że kompilator automatycznie generuje dla nas kilka metod, w tym znane metody toString, equals i hashCode w Javie.
źródło
Klasa:
Ale jeśli używamy tego samego kodu, ale używamy klasy przypadku:
Klasa osoby:
Dopasowanie wzoru:
obiekt: singleton:
źródło
Aby uzyskać maksymalne zrozumienie klasy przypadków:
załóżmy następującą definicję klasy przypadku:
a następnie wykonaj następujące czynności w terminalu:
Scala 2.12.8 wyświetli:
Jak widzimy, kompilator Scala produkuje zwykłą klasę
Foo
i obiekt towarzyszącyFoo
.Przejdźmy przez skompilowaną klasę i skomentujmy, co mamy:
Foo
klasy, niezmienny:scala.Product
cechy:scala.Equals
cechy sprawiającej, że instancje klas spraw są porównywalne pod względem równości poprzez==
:java.lang.Object.hashCode
za przestrzeganie umowy equals-hashcode:java.lang.Object.toString
:new
słowa kluczowego:Object Foo: - metoda
apply
tworzenia instancji beznew
słowa kluczowego:unupply
do użycia klasy przypadków Foo w dopasowaniu wzorca:scala.runtime.AbstractFunction2
o wykonanie takiej sztuczki:tupled
z obiektu zwraca funkcję tworzenia nowego Foo przez zastosowanie krotki 2 elementów.Tak więc klasa przypadków to po prostu cukier składniowy.
źródło
W przeciwieństwie do klas, klasy przypadków służą tylko do przechowywania danych.
Klasy spraw są elastyczne dla aplikacji skoncentrowanych na danych, co oznacza, że możesz definiować pola danych w klasie spraw i definiować logikę biznesową w obiekcie towarzyszącym. W ten sposób oddzielasz dane od logiki biznesowej.
Za pomocą metody kopiowania możesz odziedziczyć dowolne lub wszystkie wymagane właściwości ze źródła i możesz je dowolnie zmieniać.
źródło
Nikt nie wspominał, że obiekt towarzyszący klasie przypadków ma
tupled
obronę, która ma typ:Jedyny przypadek użycia, jaki mogę znaleźć, to to, kiedy musisz zbudować klasę sprawy z krotki, przykład:
Możesz zrobić to samo, bez krotek, tworząc obiekt bezpośrednio, ale jeśli twoje zbiory danych wyrażone jako lista krotek z arity 20 (krotka z 20 elementami), możesz użyć krotek to twój wybór.
źródło
Przypadek klasa to klasa, która może być używana z
match/case
oświadczeniem.Po tym
case
następuje instancja klasy Fun, której drugim parametrem jest Var. Jest to bardzo ładna i potężna składnia, ale nie może działać z instancjami żadnej klasy, dlatego istnieją pewne ograniczenia dotyczące klas spraw. A jeśli te ograniczenia są przestrzegane, możliwe jest automatyczne zdefiniowanie kodu skrótu i równe.Niejasne wyrażenie „rekurencyjny mechanizm rozkładu poprzez dopasowanie wzorca” oznacza po prostu „działa z
case
”. (Rzeczywiście, instancja, po której następuje,match
jest porównywana z (dopasowaną do) instancją, która następujecase
, Scala musi je rozłożyć i musi rekurencyjnie rozłożyć to, z czego są wykonane.)Do jakich klas spraw są przydatne? Artykuł w Wikipedii na temat Algebraicznych typów danych podaje dwa dobre klasyczne przykłady, listy i drzewa. Obsługa algebraicznych typów danych (w tym umiejętność ich porównywania) jest niezbędna w każdym nowoczesnym języku funkcjonalnym.
W jakich klasach przypadków nie są przydatne? Niektóre obiekty mają stan, podobnie jak kod
connection.setConnectTimeout(connectTimeout)
nie dotyczy klas wielkości liter.A teraz możesz przeczytać A Tour of Scala: Case Classes
źródło
Myślę, że ogólnie wszystkie odpowiedzi zawierają semantyczne wyjaśnienia dotyczące klas i klas przypadków. Może to być bardzo istotne, ale każdy początkujący w scala powinien wiedzieć, co się stanie, gdy utworzysz klasę przypadków. Napisałem tę odpowiedź, która w skrócie wyjaśnia klasę przypadków.
Każdy programista powinien wiedzieć, że jeśli korzysta z gotowych funkcji, to pisze stosunkowo mniej kodu, co umożliwia im pisanie najbardziej zoptymalizowanego kodu, ale wiąże się to z wielką odpowiedzialnością. Dlatego używaj gotowych funkcji z dużą ostrożnością.
Niektórzy programiści unikają pisania klas przypadków ze względu na dodatkowe 20 metod, które można zobaczyć po rozmontowaniu pliku klasy.
Odwołaj się do tego linku, jeśli chcesz sprawdzić wszystkie metody w klasie przypadków .
źródło
źródło
Niektóre z kluczowych funkcji
case classes
są wymienione poniżejnew
słowa kluczowego.Przykładowy kod Scala na skrzypcach Scala, zaczerpnięty z dokumentów Scala.
https://scalafiddle.io/sf/34XEQyE/0
źródło