Dev News Daily ENDE

Kotlin 2.5 zeigt Companion-Blöcke, die zu statischen JVM-Membern werden

JetBrains hat ein neues experimentelles Feature in Kotlin 2.5.0 beschrieben: Companion-Blöcke und Companion-Erweiterungen. Beide betreffen Member, die zur Klasse und nicht zu ihren Instanzen gehören, etwa Konstanten, Hilfsfunktionen und Fabrikmethoden – bisher drückt Kotlin sie über Companion-Objekte aus.

Ein Companion-Block sieht im Quelltext fast wie ein Companion-Objekt aus, wird aber anders kompiliert. Auf der JVM werden seine Member zu statischen Membern, ähnlich wie andere Plattformen Funktionen auf Typebene behandeln. Eine Companion-Erweiterung geht weiter: Sie deklariert einen neuen Member auf Typebene für eine Klasse oder ein Interface, das man nicht selbst kontrolliert – egal ob aus Kotlin oder Java und egal ob mit oder ohne Companion-Objekt. Das Beispiel im Beitrag fügt mit companion fun Vector.unit(angle: Double) eine Fabrikmethode hinzu, die dann als Vector.unit(...) aufgerufen wird.

Die statische Kompilierung hat Folgen für Kotlin Multiplatform: Ein erwarteter Member eines Companion-Blocks kann nun durch eine Java-Klasse mit statischen Membern umgesetzt werden.

Beide Features stehen hinter Compiler-Flags. -Xcompanion-blocks aktiviert die Blöcke, -Xcompanion-blocks-and-extensions beides. Mit Erweiterungen erzeugt der Compiler Pre-Release-Binaries; Bibliotheken, die sie nutzen, lassen sich deshalb womöglich erst als Abhängigkeit verwenden, wenn das Feature stabil ist. Für das Bereitstellen von Companion-Blöcken gilt diese Einschränkung nicht, Nutzer brauchen aber trotzdem das Flag für Blöcke. Das Design steht in einem KEEP-Vorschlag.

Eine Migration ist laut JetBrains nicht nötig. Companion-Objekte bleiben voll unterstützt und sind weiterhin die einzige Möglichkeit, wenn ein Companion ein Interface implementieren muss, weil sie zu einer vollständigen Klasse kompiliert werden. Der Umstieg auf einen Block bedeutet meist nur, das Schlüsselwort object zu entfernen; abhängiger Code muss aber neu kompiliert werden, und andere Werkzeuge unterstützen Blöcke womöglich noch nicht.

Kotlin 2.5 zeigt Companion-Blöcke, die zu statischen JVM-Membern werden
Kotlin 2.5 zeigt Companion-Blöcke, die zu statischen JVM-Membern werden — Dev News Daily

Warum das wichtig ist

Die statische Kompilierung beseitigt das zusätzliche Objekt, das jedes Companion auf der JVM bisher mitbrachte, und macht die Java-Interoperabilität natürlicher. Wegen der Pre-Release-Regel sollten Bibliotheksautoren mit Erweiterungen in öffentlichen APIs noch warten.