Jakie są zalety obiektów towarzyszących Scali w porównaniu do metod statycznych?

50

Scala nie ma statycznego słowa kluczowego , ale zamiast tego ma podobną funkcjonalność dzięki obiektom towarzyszącym. Za kulisami obiekty towarzyszące są kompilowane do klas, które mają metody statyczne, więc wszystko to jest cukrem składniowym. Jakie są zalety tego wyboru projektu? Niedogodności? Czy inne języki mają podobne konstrukcje?

Zavior
źródło

Odpowiedzi:

49

Oto kilka powodów, które mogą być dla Ciebie mniej lub bardziej atrakcyjne, w zależności od twoich preferencji:

  1. Nie lekceważ tego za bycie „cukrem syntaktycznym”. Chociaż możesz powiedzieć, że coś jest po prostu cukrem syntaktycznym, to przecież cukier słodzi twoje życie - jako programista, a także pijący kawę lub herbatę.

  2. Singletony - każda Scala objectjest z natury singletonem. Biorąc pod uwagę, że w świecie Java ludzie wdrażają singletony na wiele różnych sposobów i częściej popełniają jakiś błąd w ich implementacji, nie można popełnić tak prostego błędu w Scali. Pisanie objectzamiast classsprawia, że ​​jest to singleton i gotowe.

  3. Dostęp do metod statycznych: Do metod statycznych w Javie można uzyskać dostęp z obiektów. Załóżmy na przykład, że masz klasę Cz metodą statyczną fi obiekt ctypu C. Następnie powinieneś zadzwonić C.f, ale Java pozwala (choć z ostrzeżeniem) na użycie c.f, które, kiedy pochodzisz z tła Scali, nie ma żadnego sensu, ponieważ obiekty tak fnaprawdę nie mają metody .

  4. Wyraźne rozdzielenie: w Javie możesz łączyć atrybuty i metody statyczne i niestatyczne w klasie. Jeśli pracujesz zdyscyplinowany, nie staje się to problemem, ale jeśli ty (lub ktoś inny w tej sprawie) tego nie robisz, to skończy się to przeplataniem części statycznych i niestatycznych i trudno jest to stwierdzić na pierwszy rzut oka co jest statyczne, a co nie. W Scali wszystko, co znajduje się w obiekcie towarzyszącym, jest jasne, że nie jest częścią obiektów wykonawczych odpowiedniej klasy, ale jest dostępne z kontekstu statycznego. Odwrotnie, jeśli jest napisany wewnątrz klasy, jest dostępny dla instancji tej klasy, ale nie z kontekstu statycznego. Staje się to szczególnie uciążliwe w Javie, gdy zaczniesz dodawać statyczne i niestatyczne bloki inicjujące do swojej klasy. Może to być bardzo trudne do zrozumienia pod względem dynamicznej kolejności wykonywania.

  5. Mniej kodu: Nie musisz dodawać słowa static do każdego atrybutu lub metody w object, dzięki czemu kod jest bardziej zwięzły (w rzeczywistości nie jest to znacząca zaleta).

Wady są znacznie trudniejsze do znalezienia. Można argumentować, że części statyczne i niestatyczne powinny należeć do siebie, ale są oddzielone koncepcją Scala obiektów towarzyszących. Na przykład może wydawać się dziwne mieć diagram klas, ale w końcu trzeba stworzyć dwie rzeczy w kodzie i przeanalizować, który atrybut idzie gdzie.

Szczery
źródło
1
Przeczytałem również, że statyka nie należy do czystego oprogramowania OOP. Na przykład, gdy potrzebujesz zachowania statycznego, użyj własnej klasy i utwórz jeden (singletonowy) obiekt, który zarządza (potencjalnie) statycznym zachowaniem obiektów innej klasy.
K ..
1
„Pisanie obiektu zamiast klasy czyni go singletonem i gotowe.” Sam nie dbam zbytnio o Singletony, ale muszę przyznać, że bezpośredniość tego szczególnego „cukru syntaktycznego” ma pewien urok.
Ed Hastings,
3
Żaden z punktów od 1 do 5 (a nawet wszystkie razem) nie wymaga implementacji prawdziwego obiektu towarzyszącego w czasie wykonywania. Wszystkie z nich można łatwo zrobić z czystego cukru syntaktycznego, bez wpływu na środowisko uruchomieniowe. Jedyny prawdziwy powód posiadania obiektu towarzyszącego w środowisku wykonawczym podano w odpowiedzi Aleksieja Romanowa.
mas.morozov
„Wady są znacznie trudniejsze do znalezienia”. Występ? dostęp do metody obiektowej generuje ifnonnullkod bajtowy itp., w porównaniu z prostym invokeStatic.
Eduardo Pareja Tobes,
33

Kolejną zaletą jest to, że objectmogą implementować interfejsy / cechy, w przeciwieństwie do metod statycznych.

Aleksiej Romanow
źródło
8
Myślę, że to zasadnicza różnica między obiektu towarzyszącego vs klasy z metod statycznych. Obiekt towarzyszący jest polimorficzny i może być przekazywany jako argument do metod, które oczekują interfejsu / cechy.
dcastro
4

Obiekty towarzyszące są pierwszym miejscem poszukiwania implikacji, po czym scala patrzy na Predef, a następnie w wyraźnych instrukcjach „importowania” w tym konkretnym pliku źródłowym.

Nie jestem wystarczającym programistą Java, aby wiedzieć, czy język Java lub biblioteki zapewniają porównywalny mechanizm.

Gene T.
źródło