Полагаю, вы не удивитесь без аннотации @JvmStatic
; объекты могут иметь изменяемое состояние, как и классы.
Но @JvmStatic
/ @JvmField
/ @JvmOverloads
все разработаны так, чтобы не изменять никакого поведения с точки зрения Kotlin , только так выставлено на Java. Внутри метода все еще есть this
(относящийся к object Foo
), как и без аннотации. Из документации :
Если вы используете эту аннотацию, компилятор сгенерирует как метод stati c во включающем классе объекта, так и метод экземпляра в объекте сам ...
То же самое для именованных объектов:
object Obj {
@JvmStatic fun callStatic() {}
fun callNonStatic() {}
}
В Java:
Obj.callStatic(); // works fine
Obj.callNonStatic(); // error
Obj.INSTANCE.callNonStatic(); // works, a call through the singleton instance
Obj.INSTANCE.callStatic(); // works too
Очевидно, что метод экземпляра может управлять состоянием экземпляра ; в то время как метод stati c может просто вызвать экземпляр один и быть определен как
public static final void updateBar(int updateVal) {
Foo.INSTANCE.updateBar(updateVal);
}
(даже если в соответствии с ответом @Joffrey это не так, как работает текущая реализация).