Начиная с Kotlin 2.5.0-Beta1 можно экспериментировать с блоками-компаньонами.
data class Vector(val x: Double, val y: Double) {
companion {
val ZERO = Vector(0.0, 0.0)
}
}
Выглядит как
companion object, только без object. На JVM содержимое такого блока компилируется в статические члены. Никакого отдельного объекта и меньше церемоний при работе с Java.Ещё интереснее companion extensions. Они позволяют добавить член любому Kotlin- или Java-классу, даже если у него нет собственного компаньона.
companion fun Vector.unit(angle: Double) =
Vector(cos(angle), sin(angle))
Вызывать можно привычно через
Vector.unit(...).Существующие
companion object никуда не исчезают. Они по-прежнему нужны, если компаньон должен реализовать интерфейс или обладать собственной идентичностью.Для экспериментов нужен флаг
-Xcompanion-blocks-and-extensions. Только учитывайте, что расширения-компаньоны пока создают pre-release-бинарники. Тащить их в публичную библиотеку рановато. 🙅♂️🔗 Наш перевод на Хабр
🔗 Анонс JetBrains
🔗 KEEP