Как скрыть поле для латинировки 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
Не иметь доступа к контроллеру Spring boot, но иметь доступ к index.html Преобразованный файл класса java в kotlin делает ошибку компиляции kotlin.jvm.KotlinReflectionNotSupportedError: Реализация отражения Kotlin не найдена во время выполнения. Удостоверьтесь, что у вас есть kotlin-reflect.jar Использование свойства NewApi по-прежнему вызывает предупреждения lint как вибрировать устройство при нажатии кнопки с использованием эффектов вибратора? Использование Kotlin Кнопки доступа из макета, программно раздутые в другом макете Заголовки HTTP не возвращаются на EC2 Записать вызов / транзакцию в TransactionalEventListener Не удалось загрузить файл на Android, и нет никаких сведений об ошибке Аннотации @JsonValue в классе ценности перечисления класса Kotlin Kotlin null от Java Могу ли я отложить привязку вида в адаптере с помощью расширения Kotlin Android Проверка типов запустила рекурсивную в kotlin Есть ли какие-либо документы об модификаторах доступа в Котлин? почему kotlin lambda декомпилируется в java-код (Function0) null.INSTANCE