JetBrains testet in Kotlin 2.5.0 zwei neue Mechanismen namens Companion Blocks und Companion Extensions, um die Definition typbezogener Mitglieder zu erweitern und die Interoperabilität zwischen verschiedenen Kotlin-Plattformen zu verbessern. Nach Angaben des Unternehmens eröffnet das neue Design Programmiermuster, die mit herkömmlichen Companion Objects bisher nicht ohne Weiteres verfügbar waren.
Was fügt der neue Mechanismus hinzu?
Typbezogene Mitglieder werden verwendet, um Konstanten, Hilfsfunktionen und Erstellungsmethoden zu definieren, die nicht zu einem einzelnen Objekt gehören, beispielsweise eine Konstante, die den Nullvektor darstellt, oder eine Funktion, die einen Vektor anhand eines bestimmten Winkels erstellt. Bisher beruhte diese Verwendung auf Companion Objects, während die neuen Companion Blocks es ermöglichen, diese Art von Mitgliedern in einer Syntax zu schreiben, die ihrer Definition innerhalb des Typs selbst näherkommt.
Companion Extensions erlauben es dagegen, jedem beliebigen Typ oder Interface typbezogene Mitglieder hinzuzufügen, selbst wenn der Entwickler nicht Eigentümer des ursprünglichen Codes ist und selbst wenn der Typ aus Java stammt oder ursprünglich kein Companion Object enthält. Dadurch können externe Typen erweitert werden, ohne ihre grundlegende Definition zu ändern.
Änderungen bei Kompilierung und Kompatibilität
Der neue Mechanismus unterscheidet sich von Companion Objects durch seine Kompilierungsstrategie. Auf der JVM-Plattform werden Companion Blocks in static-Mitglieder übersetzt, wodurch sich ihr Verhalten den statischen Mitgliedern anderer Plattformen annähert. JetBrains zufolge könnte dies Kotlin Multiplatform zugutekommen, da erwartete Mitglieder in einem Companion Block definiert und anschließend mithilfe einer Java-Klasse implementiert werden können, die static-Mitglieder enthält.
Die Funktionen sind jedoch weiterhin experimentell. Für die Aktivierung von Companion Blocks muss die Option -Xcompanion-blocks verwendet werden, während die Kombination aus Blocks und Extensions die Option -Xcompanion-blocks-and-extensions erfordert.
Einschränkungen der experimentellen Verwendung
Bei der Verwendung von Companion Extensions erzeugt der Compiler Binärdateien aus der Vorabversion. Daher können andere Projekte oder Bibliotheken möglicherweise keine Bibliotheken, die diese Extensions verwenden, als Abhängigkeiten nutzen, bis die Funktion offiziell stabil ist. Für die Offenlegung von Companion Blocks gilt diese Einschränkung nicht, doch auch ihre Nutzer müssen die Funktion aktivieren.
Müssen Companion Objects migriert werden?
JetBrains empfiehlt keine sofortige Migration. Companion Objects bleiben ein grundlegender Bestandteil von Kotlin, und ihre vollständige Unterstützung ist garantiert. Companion Blocks könnten in den meisten Fällen die bevorzugte Option für neuen Code sein, doch Companion Objects bleiben in bestimmten Fällen erforderlich, etwa wenn der Companion ein Interface implementieren muss, da er in eine vollständige Klasse übersetzt wird.
In der Praxis kann es in vielen Fällen ausreichen, das Wort object zu entfernen, um zu einem Companion Block zu wechseln. Das Projekt und der gesamte davon abhängige Code müssen jedoch neu kompiliert werden. Außerdem warnt JetBrains davor, dass einige Tools des Ökosystems möglicherweise noch nicht bereit sind, mit der neuen Syntax umzugehen.
Warum ist diese Entwicklung wichtig?
Die Änderung ist für Entwickler von Kotlin Multiplatform und für Bibliotheksautoren wichtig, weil sie versucht, die Kluft zwischen dem Konzept statischer Mitglieder auf der JVM und auf anderen Plattformen zu verringern. Ihr praktischer Wert ist derzeit jedoch weiterhin an eine experimentelle Phase sowie daran gebunden, wie schnell Build-Tools, Bibliotheken und Editoren aktualisiert werden. Daher scheinen Companion Blocks derzeit für Erprobung und die Bewertung des Designs geeignet, nicht jedoch als sichere Grundlage für eine umfassende Migration, bevor die Funktion stabil ist.