Как скрыть поле для латинировки var Kitlin с помощью Java?

Предположим, в Котлине у меня есть класс:

class MyKotlinClass { lateinit var field: String } 

Согласно документам :

Свойства поздней инициализации также отображаются как поля. Наглядность поля будет такой же, как и видимость сетчатого активатора lateinit.

Я могу использовать в java- коде либо myKotlinClass.field либо myKotlinClass.getField() . Я хочу отключить доступ к полям и оставаться только доступ через getter и setter .

Как я могу достичь этого и оставаться модификатором lateinit ?

Вы можете использовать @JvmSynthetic который скрывает объявления от Java (а не от Kotlin). Просто аннотируйте фоновое поле свойства:

 @field:JvmSynthetic lateinit var field: String 

Хотя поле будет оставаться public в байт-коде, оно также будет иметь synthetic модификатор, который не позволяет использовать его в источниках Java. Тем не менее, поле, похоже, все еще доступно через отражение во время выполнения.

См. Также: еще один вопрос о @JvmSynthetic (хотя нет однозначного ответа там).

Классическим решением этой проблемы было бы использование делегирования собственности :

 import kotlin.properties.Delegates class MyKotlinClass { var field: String by Delegates.notNull() } 

Этот код делает именно то, что вы просили в вопросе

Видимость поля lateinit получается из видимости сеттера соответствующего свойства, поэтому другой вариант состоит в том, чтобы иметь свойство с непубличным сеттером:

 lateinit var field: String private set 

Недостатком этого подхода является то, что сам сеттер становится недоступным вне класса.

Intereting Posts
Kotlin: Разница между объектом и сопутствующим объектом в классе Общие параметры Любой из kotlin преобразуется в подстановочные знаки (?) @Embeddable класс с val в Котлине permissionsdispatcher и несколько @ NeedsPermission с kotlin Android N Java 8 (компилятор Jack) и Kotlin interop ProcessBuilder не может найти Kotlin в пути Включить свойство, объявленное в теле класса данных в toString () в Котлине Посылка: неспособность маршалировать стоимость 'x' не является функцией при передаче параметров в Kotlin Javascript Каков правильный способ работы с полями в Котлине? Почему объектам, находящимся внутри объекта сопутствующего объекта Kotlin, не удается получить доступ к «статически», когда другие члены могут? Kotlin получает цель jquery click Kotlin Pass в типе, который реализует параметризованный интерфейс Как я могу получить время, необходимое для проверки производительности функций в Котлине Котлин – для каждого