Warum gibt es in Kotlin kein statisches Schlüsselwort?

29

Kotlin ist in erster Linie als Drop-In-Ersatz für Java bekannt, jedoch wird ein bekanntes Java-Konstrukt entfernt: das staticSchlüsselwort. Stattdessen wird diese Funktionalität auf Klassenebene hauptsächlich von Begleitobjekten angeboten.

Was ist falsch an statischen Methoden und Feldern, zu denen Companion-Objekte eine bessere Alternative darstellen? Ich bin verwirrt über die Gründe und konnte in der Dokumentation keine Erklärung finden.

user1446
quelle
4
Wenn Sie nur als jemand zuschauen, der in scala programmiert: Companion-Objekte trennen den Code für statische und nicht statische Methoden, sie können andere Klassen oder Schnittstellen in einem statischen Kontext erweitern und Sie können das Companion-Objekt in einer Variablen referenzieren. Ich bin mir nicht sicher, wie das auf Kotlin abgebildet ist
Phoenix
Haben statische Methoden und so weiter einen signifikanten Vorteil gegenüber Begleitobjekten?
Tanner Swett
Dies ist nicht der Grund, eher eine Beobachtung, aber ich habe gesehen, dass, sobald (absolute) Anfänger-Programmierer das staticSchlüsselwort in Java entdecken , es sich sofort auf alle Ecken des Programms ausbreitet, da ihnen objektorientiertes Programmieren noch nicht beigebracht wurde .
Score_Under

Antworten:

30

Scala ersetzt auch Deklarationen auf Klassenebene durch ein 'Singleton'-Objekt. Der Hauptvorteil davon ist, dass alles ein Objekt ist. In Java werden statische Member ganz anders behandelt als Objektmember. Dies bedeutet, dass Sie beispielsweise keine Schnittstelle implementieren oder Ihre Klasseninstanz in eine Map einfügen oder als Parameter an eine Methode übergeben können, die Object verwendet. Begleitobjekte berücksichtigen diese Dinge. Das ist der Vorteil.

JimmyJames
quelle
2
Das ist ein guter Punkt. Und ich fand es immer seltsam, dass es Singletons und Statiken gibt, die sich sehr ähnlich verhalten, aber mit nichts als Begleitobjekten wird diese konzeptionelle Kuriosität beseitigt.
user1446
1
Und genau aus diesem Grund definiere ich in Java lieber Methoden für statisch aufgebaute zustandslose Objekte als statische Methoden.
candied_orange
13

Zitieren aus den Kotlin- Referenzdokumenten :

Beachten Sie, dass die Mitglieder von Begleitobjekten zur Laufzeit immer noch Instanzmitglieder realer Objekte sind und beispielsweise Schnittstellen implementieren können, obwohl sie in anderen Sprachen wie statische Mitglieder aussehen.

Klingt für mich sehr nach einem Vorteil für die Kotlin-Designer gegenüber den statischen Mitgliedern von Java.

Darüber hinaus wird im Abschnitt zur Java-Interoperabilität und zu statischen Elementen erläutert, wie Companion-Objekte verwendet werden können, um Elemente zu erstellen, die sich bei Kommentierung mit effektiv wie statische Elemente verhalten @JvmStatic.

Doc Brown
quelle
6

Kotlin ist eine objektorientierte Sprache. In einer objektorientierten Sprache ist etwas, das kein Objekt ist, eine äußerst lähmende Einschränkung. Klassen sind keine Objekte, aber Objekte sind Objekte (duh!), Daher sollte die Frage lauten: Warum würde eine Sprache keine Begleitobjekte verwenden?

Ein weiterer Aspekt ist die Einfachheit: Warum gibt es zwei Dinge, Objekte mit Instanzmitgliedern und Klassen mit statischen Mitgliedern, wenn Sie nur Objekte mit Instanzmitgliedern haben können?

Eine Alternative, die in vielen von Smalltalk abgeleiteten Sprachen verwendet wird, besteht darin, Klassen selbst zu Objekten zu machen. Beispielsweise sind in Smalltalk-Klassen Instanzen einer parallelen Hierarchie von Metaklassen . In Ruby sind Klassen Instanzen der ClassKlasse (und ja, das bedeutet, dass dies Classeine Instanz von sich selbst ist). In diesem Fall sind "Klassenmethoden" eigentlich nur normale Instanzmethoden der Metaklasse der Klasse. Ich weiß nicht, warum dieses Design in Java nicht ausgewählt wurde (da es in enger Beziehung zu Smalltalk steht), aber es hat möglicherweise etwas mit der Vereinfachung des Typsystems zu tun (beachten Sie, dass die meisten Sprachen mit Klassen als Objekte dazu neigen, zu sein dynamische Sprachen).

Jörg W. Mittag
quelle
1
"Ein weiterer Aspekt ist die Einfachheit: Warum gibt es zwei Dinge, Objekte mit Instanzmitgliedern und Klassen mit statischen Mitgliedern, wenn Sie nur Objekte mit Instanzmitgliedern haben können?" Einige sehen es als Vorteil an, Ad-hoc-Konstrukte für spezielle Fälle oder Redewendungen zu haben.
Giorgio,
1
Ich denke , es ist zumindest fraglich , dass Java nicht (etwas) dieses Muster implementieren. Wenn Sie beispielsweise eine Instanz MyStaticClassmit einigen staticMitgliedern haben, können Sie darauf verweisen MyStaticClass.class, eine ClassInstanz für diese Klasse abzurufen. Sie können dann Reflection verwenden, um auf Ihre staticMitglieder zuzugreifen bzw. sie aufzurufen . Es ist immer noch wahr, dass die staticMitglieder tatsächlich keiner Objektinstanz zugeordnet sind (zumindest konzeptionell; nicht sicher, was Java tatsächlich im Hintergrund tut). Dies bedeutet jedoch, dass zumindest einige der in der akzeptierten Antwort genannten Grenzwerte nicht unbedingt zutreffen.
Donnerstag,