2016-03-25 2 views
4

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

+1

Помимо концептуального материала, да: частная собственность ведет себя как поле и фактически скомпилирована в поле, то есть нет методов доступа. –

+1

@ KirillRakhman, только если у него нет пользовательских аксессуаров, конечно. – hotkey

ответ

9

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

В Котлин, все свойства элементов, 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, но она будет иметь различную семантику.

1

Нет, потому что «классы в Котлине не могут иметь полей» (Properties and Fields - Kotlin Programming Language).

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

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

+0

Частная собственность, на Java, является частным полем (при определенных условиях). Аннотации необходимо только для * выставить * поле (сделать его более видимым, чем личное). «доступ к приватным свойствам с использованием геттеров и сеттеров по умолчанию оптимизирован, чтобы не вводить служебные данные для функций» –