Заглянув в properties в Котлине, эта концепция для меня несколько нова, поэтому мне любопытно, можно ли утверждать, что частный property
является field
(переменная экземпляра)?Является частной собственностью 'поле'?
ответ
Вы можете рассмотреть свойства в качестве значений, которые вы можете получить (и набор для изменяемых из них), но они могут иметь обычаи и переопределение поведения и не могут быть на самом деле хранятся. Таким образом, свойства не являются полями.
В Котлин, все свойства элементов, private
или нет, может иметьbacking field, но это не обязательно.
недвижимости с полем подложки:
var counter = 0
Здесь
0
помещается в поле подложки, а свойство ведет себя как поле: получение значения из него возвращает значение, хранящееся в поле, устанавливая значение для него, просто сохраняет значение в поле поддержки. Но это не поле, например. для Java он все равно будет парой getter и setter.Частных свойств без специальных are optimized и методов доступа скомпилированы в поля, чтобы избежать накладных расходов вызова функции, но это скорее деталь реализации, и добавление пользовательских аксессор будет также изменить байткод, доступ к свойству компилируется в.
var counter = 0 get() = field + 1 set(value) { if (value >= 0) field = value }
Здесь снова свойство имеет поле подложки, но его поведение отличается, пользовательские методы доступа
get()
иset(...)
будут выполнены в отчетности какcounter = something
илиval x = counter
. Это справедливо для доступа к свойствам как внутри, так и вне класса, а свойстваprivate
здесь не отличаются.Доступ к полю обратной связи можно получить непосредственно только внутри кода доступа с помощью мягкого ключевого слова
field
, он не отображается в другом коде. Если вы хотите получить доступ к значению резервного копирования из другого места, вам нужно определить еще один backing property. Вы можете открыть поле поддержки для кода Java, добавив в свойство@JvmField
аннотацию (это не сделает ее доступной из Котлина).Свойство без поля подложки
Если свойство не имеет инициализатора и имеет, по крайней мере
get()
, это свойство, без поля подложки:val time: Long get() = System.currentTimeMillis()
Нет поле поддержки не будет сгенерировано для него , но вы можете использовать другое свойство в качестве свойства поддержки, как указано выше.
свойства, не имеющие поля подложки также может быть extension properties, что довольно далеко от полей:
val String.isCapitalized: Boolean get() = length > 0 && this[0].isUpperCase()
Они также могут быть private
, но она будет иметь различную семантику.
Нет, потому что «классы в Котлине не могут иметь полей» (Properties and Fields - Kotlin Programming Language).
Кроме того, «если вам нужно выставить свойство Kotlin в качестве поля в Java, вам необходимо аннотировать его аннотацией @JvmField
» (Calling Kotlin from Java - Kotlin Programming Language). Однако это еще не поле.
Поскольку классы Kotlin не имеют полей, лучше всегда ссылаться на свойства как свойства.
Частная собственность, на Java, является частным полем (при определенных условиях). Аннотации необходимо только для * выставить * поле (сделать его более видимым, чем личное). «доступ к приватным свойствам с использованием геттеров и сеттеров по умолчанию оптимизирован, чтобы не вводить служебные данные для функций» –
Помимо концептуального материала, да: частная собственность ведет себя как поле и фактически скомпилирована в поле, то есть нет методов доступа. –
@ KirillRakhman, только если у него нет пользовательских аксессуаров, конечно. – hotkey