Dlaczego w Kotlin nie ma statycznego słowa kluczowego?

29

Kotlin jest znany przede wszystkim jako drop-in zamiennik Javy, ale pozbywa się dobrze znanego konstruktu Java: staticsłowa kluczowego. Zamiast tego ta funkcjonalność na poziomie klasy jest oferowana głównie przez obiekty towarzyszące.

Co jest złego w metodach statycznych i polach, dla których obiekty towarzyszące stanowią lepszą alternatywę dla? Jestem zdezorientowany uzasadnieniem i nie mogłem znaleźć żadnego wyjaśnienia w dokumentacji.

użytkownik1446
źródło
4
Po prostu widząc, jak ktoś, kto programuje w scala: obiekty towarzyszące oddzielają kod dla metod statycznych i niestatycznych, mogą rozszerzać inne klasy lub interfejsy w kontekście statycznym, a ty możesz odwoływać się do obiektu towarzyszącego w zmiennej. nie jestem pewien, jak to się odwzorowuje na kotlin
Phoenix
Czy metody statyczne i co nie mają znaczącej przewagi nad obiektami towarzyszącymi?
Tanner Swett
To nie jest powód, a raczej spostrzeżenie, ale zauważyłem, że gdy tylko (absolutni) początkujący programiści odkryją staticsłowo kluczowe w Javie, natychmiast rozprzestrzenia się ono we wszystkie zakątki programu, ponieważ nie nauczono ich programowania obiektowego .
Score_Under

Odpowiedzi:

30

Scala zastępuje również deklaracje na poziomie klasy obiektem „Singleton”. Główną zaletą tego jest to, że wszystko jest przedmiotem. W Javie elementy statyczne są traktowane bardzo inaczej niż elementy obiektowe. Oznacza to, że nie możesz robić rzeczy takich jak implementacja interfejsu lub umieszczanie „instancji” klasy na mapie lub przekazywanie jej jako parametru do metody, która pobiera Object. Obiekty towarzyszące pozwalają na te rzeczy. To zaleta.

JimmyJames
źródło
2
Trafne spostrzeżenie. I zawsze myślałem, że to dziwne, że są singletony i statyki, które mają bardzo podobne zachowania, ale z niczym innym, jak przedmiotami towarzyszącymi, eliminuje to konceptualną osobliwość.
user1446,
1
I właśnie dlatego w Javie wolę definiować metody na statycznie konstruowanych obiektach bezstanowych niż metody statyczne.
candied_orange
13

Powołując się na dokumenty referencyjne Kotlin :

Należy zauważyć, że chociaż elementy obiektów towarzyszących wyglądają jak elementy statyczne w innych językach, w czasie wykonywania są one nadal elementami rzeczywistymi obiektów i mogą na przykład implementować interfejsy.

Wydaje mi się, że projektanci Kotlin postrzegają to jako przewagę nad statycznymi elementami Javy.

Ponadto w części dotyczącej interoperacyjności Java i elementów statycznych wyjaśniono, w jaki sposób można używać obiektów towarzyszących do tworzenia elementów, które zachowują się skutecznie jak elementy statyczne, gdy są opatrzone adnotacjami @JvmStatic.

Doktor Brown
źródło
6

Kotlin jest językiem obiektowym. W języku obiektowym coś, co nie jest przedmiotem, jest wyjątkowo okaleczającym ograniczeniem. Klasy nie są obiektami, ale obiekty są obiektami (duh!), Więc pytanie powinno raczej brzmieć: dlaczego język nie miałby używać obiektów towarzyszących?

Innym aspektem jest prostota: dlaczego mają dwie rzeczy: obiekty z elementami instancji i klasy z elementami statycznymi, skoro można mieć tylko obiekty z elementami instancji?

Alternatywą stosowaną w wielu językach pochodzących z Smalltalk jest tworzenie obiektów jako klas. Np. W klasach Smalltalk występują instancje równoległej hierarchii metaklas . W Rubim klasy są instancjami Classklasy (i tak, to znaczy, że Classjest instancją samej w sobie). W takim przypadku „metody klasowe” są właściwie zwykłymi metodami instancji metaklasy klasy. Nie wiem, dlaczego ten projekt nie został wybrany w Javie (biorąc pod uwagę jego bliską relację z Smalltalk), ale może mieć coś wspólnego z uproszczeniem systemu typów (zwróć uwagę, że większość języków z klasami jako obiektami jest zwykle języki dynamiczne).

Jörg W Mittag
źródło
1
„Innym aspektem jest prostota: dlaczego mają dwie rzeczy: obiekty z elementami instancji i klasy ze elementami statycznymi, skoro można po prostu mieć obiekty z elementami instancji?”: Dobra uwaga, mimo że nie wszystkie języki / projektanci języków dążą do minimalizmu. Niektórzy postrzegają to jako zaletę posiadania konstrukcji ad-hoc dla specjalnych przypadków lub idiomów.
Giorgio
1
Myślę, że to przynajmniej twierdzić, że Java jest (nieco) wdrożenia tego wzoru. Na przykład, jeśli masz MyStaticClassz niektórymi staticczłonkami, możesz odwołać się MyStaticClass.classdo uzyskania Classinstancji dla tej klasy. Następnie możesz użyć refleksji, aby uzyskać dostęp / wywołać swoich staticczłonków. Nadal jest prawdą, że staticelementy nie są faktycznie podłączone do żadnej instancji obiektu (przynajmniej koncepcyjnie; nie jestem pewien, co Java faktycznie robi pod przykryciem). Ale to oznacza, że ​​przynajmniej niektóre limity podniesione w zaakceptowanej odpowiedzi nie mają ścisłego zastosowania.
aroth