Kotlin ist in erster Linie als Drop-In-Ersatz für Java bekannt, jedoch wird ein bekanntes Java-Konstrukt entfernt: das static
Schlü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.
language-design
user1446
quelle
quelle
static
Schlüsselwort in Java entdecken , es sich sofort auf alle Ecken des Programms ausbreitet, da ihnen objektorientiertes Programmieren noch nicht beigebracht wurde .Antworten:
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.
quelle
Zitieren aus den Kotlin- Referenzdokumenten :
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
.quelle
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
Class
Klasse (und ja, das bedeutet, dass diesClass
eine 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).quelle
MyStaticClass
mit einigenstatic
Mitgliedern haben, können Sie darauf verweisenMyStaticClass.class
, eineClass
Instanz für diese Klasse abzurufen. Sie können dann Reflection verwenden, um auf Ihrestatic
Mitglieder zuzugreifen bzw. sie aufzurufen . Es ist immer noch wahr, dass diestatic
Mitglieder 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.