Является ли частное свойство «полем»?

Изучая свойства в Котлине, эта концепция для меня несколько нова, поэтому мне любопытно, правильно ли утверждать, что частное property является field (переменной экземпляра)?

Вы можете рассматривать свойства как значения, которые вы можете получитьустановить для изменяемых), но они могут иметь настраиваемое и чрезмерное поведение и могут быть фактически не сохранены. Таким образом, свойства не являются полями.

В Kotlin все свойства участника, private или нет, могут иметь фоновое поле , но это необязательно.

  • Недвижимость с резервным полем:

     var counter = 0 

    Здесь 0 помещается в поле поддержки, и свойство ведет себя как поле : получение значения из него возвращает значение, хранящееся в поле, при этом значение для него просто сохраняет значение в поле поддержки. Но это не поле, например, для Java он все равно будет парой getter и setter.

    Частные свойства без пользовательских аксессуаров оптимизированы и скомпилированы в поля, чтобы избежать накладных расходов на функциональные вызовы, но это скорее детали реализации, и добавление пользовательского аксессора также изменит байт-код, в который будет скомпилирован доступ к свойству.

     var counter = 0 get() = field + 1 set(value) { if (value >= 0) field = value } 

    Здесь снова свойство имеет фоновое поле, но его поведение отличается, пользовательские accessors get() и set(...) будут выполняться в таких выражениях, как counter = something или val x = counter . Это справедливо для доступа к свойству как внутри, так и снаружи класса, а private свойства здесь не отличаются.

    Окно поддержки можно получить непосредственно только внутри кода доступа, используя field мягкого ключевого слова, оно не отображается в другом коде. Если вы хотите получить доступ к значению резервного копирования из другого места, вам нужно определить другое свойство backing . Вы можете открыть поле поддержки для Java-кода, добавив к свойству @JvmField аннотацию (это не сделает ее доступной из Kotlin).

  • Свойство без поля поддержки

    Когда свойство не имеет инициализатора и имеет хотя бы get() , это свойство без поля поддержки:

     val time: Long get() = System.currentTimeMillis() 

    Для него не будет создано поле поддержки, но вы можете использовать другое свойство как свойство поддержки, как указано выше.


Свойства без поля поддержки также могут быть свойствами расширения , которые довольно далеки от полей :

 val String.isCapitalized: Boolean get() = length > 0 && this[0].isUpperCase() 

Они также могут быть private , но у них будет другая семантика.

Нет, потому что «классы в Котлин не могут иметь полей» (« Свойства и поля – язык программирования Котлина» ).

Кроме того, «если вам нужно открыть свойство Kotlin в качестве поля в Java, вам необходимо аннотировать его с @JvmField аннотации @JvmField » ( Calling Kotlin from Java – язык программирования Kotlin ). Однако это еще не поле.

Поскольку классы Kotlin не имеют полей, лучше всегда ссылаться на свойства как свойства.

Intereting Posts
Объектный конструктор и Delegates.notNull Познакомиться с достопримечательностями в Котлин Kotlin – Значение преобразования при инициализации Вызов Kotlin из Java – ошибка: демо-версия пакета не существует Выполнение не выполнено для задачи ': app: compileDebugKotlin'. > Внутренняя ошибка компилятора. Подробнее см. Журнал Общий код между сервером Kotlin и клиентскими проектами с использованием Gradle TornadoFX JavaFX Sync Прокрутка по таблицам В чем разница, если я удаляю ключевое слово 'var' в классе? Написание JSP в kotlin с maven – Ошибка создания класса сервлета, ClassNotFoundException Kotlin переопределяет абстрактное поведение val, объект vs class как использовать @jvmoverloads с интерфейсом в Kotlin Как улучшить синтаксис лямбда kotlin? Странная ошибка «Val не может быть переназначена» при установке свойства в Kotlin объекта Java Количество экземпляров каждого тега с использованием функционального программирования Фильтрация данных из коллекции с определенной строкой