Scala hat kein statisches Schlüsselwort, sondern eine ähnliche Funktionalität durch Begleitobjekte. Hinter den Kulissen werden die Companion-Objekte zu Klassen kompiliert, die statische Methoden haben. Das alles ist syntaktischer Zucker. Was sind die Vorteile dieser Designauswahl? Nachteile? Haben andere Sprachen ähnliche Konstrukte?
50
Antworten:
Hier sind einige Gründe, die für Sie je nach Ihren Vorlieben mehr oder weniger überzeugend sein können:
Diskontieren Sie es nicht einfach als "syntaktischen Zucker". Während Sie vielleicht sagen, dass etwas nur syntaktischer Zucker ist, ist es doch der Zucker, der Ihr Leben versüßt - als Programmierer genauso wie als Kaffee- oder Teetrinker.
Singletons - Jede Scala
object
ist von Natur aus ein Singleton. In Anbetracht der Tatsache, dass in der Java-Welt Singletons auf unterschiedlichste Weise implementiert werden und häufig Fehler in ihrer Implementierung auftreten, können Sie einen Fehler in Scala nicht so einfach machen. Schreibenobject
stattclass
macht es zu einem Singleton und Sie sind fertig.Zugriff auf statische Methoden: Auf die statischen Methoden in Java kann von Objekten aus zugegriffen werden. Angenommen, Sie haben eine Klasse
C
mit einer statischen Methodef
und einem Objektc
vom TypC
. Dann sollten Sie aufrufenC.f
, aber Java erlaubt es Ihnen (wenn auch mit einer Warnung) zu verwendenc.f
, was, wenn Sie aus dem Scala-Hintergrund kommen, eigentlich keinen Sinn ergibt, weil Objekte eigentlich keine Methode habenf
.Klare Trennung: In Java können Sie statische und nicht statische Attribute und Methoden in einer Klasse mischen. Wenn Sie diszipliniert arbeiten, wird dies kein Problem. Wenn Sie (oder sonst jemand) dies nicht tun, verschachteln sich statische und nicht statische Teile, und es ist schwer, dies auf einen Blick zu erkennen Was ist statisch und was nicht. In Scala ist alles, was sich im Companion-Objekt befindet, eindeutig nicht Teil der Laufzeitobjekte der entsprechenden Klasse, sondern steht in einem statischen Kontext zur Verfügung. Wenn es umgekehrt in einer Klasse geschrieben ist, steht es Instanzen dieser Klasse zur Verfügung, jedoch nicht aus einem statischen Kontext. Dies ist in Java besonders lästig, wenn Sie Ihre Klasse mit statischen und nicht statischen Initialisierungsblöcken versehen. Dies kann in Bezug auf die dynamische Ausführungsreihenfolge sehr schwer nachvollziehbar sein.
Weniger Code: Sie müssen nicht jedes Attribut oder jede Methode in einem statischen Wort hinzufügen
object
, um den Code übersichtlicher zu gestalten (in der Tat kein wesentlicher Vorteil).Nachteile sind viel schwerer zu finden. Man könnte argumentieren, dass die statischen und nicht-statischen Teile zusammen gehören sollten, aber durch das Scala-Konzept der Begleitobjekte getrennt sind. Zum Beispiel mag es seltsam erscheinen, ein Klassendiagramm zu haben, aber am Ende müssen zwei Dinge im Code erstellt und herausgefunden werden, welches Attribut wohin führt.
quelle
ifnonnull
Bytecode etc im Vergleich zu simplyinvokeStatic
.Ein weiterer Vorteil ist, dass
object
s im Gegensatz zu statischen Methoden Schnittstellen / Merkmale implementieren kann.quelle
Companion-Objekte sind der erste Ort, an dem nach Implicits gesucht wird. Danach untersucht scala Predef und anschließend die expliziten "import" -Anweisungen in dieser bestimmten Quelldatei.
Ich bin kein Java-Entwickler genug, um zu wissen, ob die Java-Sprache oder die Java-Bibliotheken einen vergleichbaren Mechanismus bieten.
quelle