Czy istnieje przypadek, w którym potrzebny jest obiekt towarzyszący (singleton) dla klasy? Dlaczego miałbym chcieć utworzyć klasę, powiedzieć, Foo
a także utworzyć dla niej obiekt towarzyszący?
oop
scala
companion-object
Rahul
źródło
źródło
Odpowiedzi:
Obiekt towarzyszący w zasadzie zapewnia miejsce, w którym można umieścić metody „statyczne”. Ponadto obiekt towarzyszący lub moduł towarzyszący ma pełny dostęp do elementów członkowskich klasy, w tym do prywatnych.
Obiekty towarzyszące doskonale nadają się do hermetyzacji rzeczy, takich jak metody fabryczne. Zamiast na przykład
Foo
iFooFactory
wszędzie, możesz sprawić, by klasa z obiektem towarzyszącym przejęła obowiązki fabryki.źródło
Obiekty towarzyszące są przydatne do przechowywania stanu i metod, które są wspólne dla wszystkich wystąpień klasy, ale nie używają statycznych metod ani pól. Używają zwykłych metod wirtualnych, które można zastąpić przez dziedziczenie. Scala naprawdę nie ma nic statycznego. Można to wykorzystać na wiele sposobów, ale oto prosty przykład.
Który generuje ten wynik:
źródło
... i jest to dobre miejsce do przechowywania statycznych metod fabrycznych (nie DP) dla klas towarzyszących. Jeśli nazwiesz te przeciążone metody fabryczne Apply (/ ... /), będziesz mógł utworzyć / zainicjować swoją klasę
bez „nowego” (niezbyt ważne)
z różnymi możliwymi zestawami parametrów (porównaj z tym, co Bloch pisze w Effective Java o konstruktorze teleskopowym)
z możliwością decydowania, którą klasę pochodną chcesz utworzyć zamiast abstrakcyjnej (towarzyszącej)
Przykładowy kod:
Nie nazwałbym obiektu / klasy bazowej AbstractXxxxx, ponieważ nie wygląda to źle: jak tworzenie czegoś abstrakcyjnego. Nadaj tym imionom prawdziwe znaczenie. Rozważ użycie niezmiennych, mniej metod, klas przypadków i uszczelnij abstrakcyjną klasę bazową.
źródło
RealThing
iAlternativeThing
klasa powinny miećprivate
konstruktora, który zmusi użytkownika do korzystania zAbstractClass
fabryki has.class AlternativeThing private(i: Int) extends AbstractClass
Oprócz tego, co powiedział Saem w swojej odpowiedzi , kompilator Scala szuka również niejawnych konwersji typów w odpowiednich obiektach towarzyszących (źródłowych lub docelowych), więc konwersje nie muszą być importowane.
O przyczynie pojedynczych obiektów w ogólnym Programowaniu w Scali mówi:
źródło
Obiekty towarzyszące zawsze postrzegam jako pomost do pisania kodu funkcjonalnego i obiektowego w Scali. Często potrzebujemy tylko czystych funkcji, które pobierają pewne dane wejściowe i zapewniają wynik przetwarzania. Umieszczenie tych odpowiednich funkcji w obiekcie towarzyszącym ułatwia wyszukiwanie i używanie, zarówno dla mnie, jak i dla kogoś, kto jest oparty na moim kodzie.
Co więcej, jest to funkcja dostępna w języku, która umożliwia pisanie wzorca singleton bez robienia czegokolwiek. Jest to szczególnie przydatne, gdy potrzebujesz singletona do hermetyzacji delegatora na potrzeby życia maszyny JVM. Na przykład napisanie prostej biblioteki klienta HTTP w Scali, w której można hermetyzować podstawowy delegator oparty na implementacji Java i pozwolić konsumentom API żyć w czystym świecie.
źródło
Jeśli zdefiniujesz klasę i obiekt w tym samym pliku o tej samej nazwie, będą one znane jako klasa towarzysząca i obiekt. Scala nie ma słowa kluczowego static jako słowa kluczowego JAVA, możesz zastąpić statyczny klasą towarzyszącą i obiektem w Scali.
Aby uzyskać więcej szczegółowych informacji, sprawdź klasę artykułu i słowo kluczowe obiektu w programowaniu scala
źródło
Na początku zapewnia wyraźne oddzielenie metod statycznych od metod niestatycznych, a także zapewnia prosty sposób tworzenia klasy pojedynczej.
Może również dziedziczyć metody z innych klas i / lub cech, czego nie można zrobić za pomocą statycznych metod Java. I może być przekazywany jako parametr.
źródło