Это то же самое в Java.Имейте в виду, что они имеют один и тот же базовый байт-код .
final MyEvent myEvent = new MyEvent();
myEvent.identify();
Посмотрите на полученный байт-код для класса Kotlin MyEvent
(декомпилированный)
public class my/package/MyEvent {
...
public final identify()V
L0
LINENUMBER 14 L0
RETURN // Omitted myService.identify()
...
A companion
объект переводится в свойство класса static
в Java.
Например, для этого кода Котлина
open class MyEvent {
companion object {
fun test() = ""
}
...
}
Это результирующий байт-код
static <clinit>()V
NEW my/package/MyEvent$Companion
DUP
ACONST_NULL
INVOKESPECIAL my/package/MyEvent$Companion.<init> (Lkotlin/jvm/internal/DefaultConstructorMarker;)V
PUTSTATIC my/package/MyEvent.Companion : Lmy/package/MyEvent$Companion;
RETURN
MAXSTACK = 3
MAXLOCALS = 0
}
Что означает, в основном
public class MyEvent {
public static final Companion Companion = new Companion(...);
...
}
Итак, в Java вы можете получить к нему доступ, используя
MyEvent.Companion.test();
Для
open class MyEvent {
object Factory {
fun test() = ""
}
...
}
Было быв Java
MyEvent.Factory.INSTANCE.test();
В конечном итоге в Java нет концепции сопутствующих объектов.
Вместо этого используются static
свойства и методы.