среда, 14 марта 2012 г.

Свойства и поля в Kotlin

В Java принят подход, при котором мы пишем поля и добавляем им геттеры (getters) и сеттеры (setters). Из публичных классов мы используем методы доступа (accessor), а не публичные поля. Во всех основных средах разработки есть средства для генерации геттеров и сеттеров.

Большинство строчек в классе - шаблонный код.

 

В Kotlin нет способа определить поле, все является свойствами. Возможность записи и чтения определяется ключевым словом var, только чтения - val.

Мы видим изменяемое (mutable) свойство var, и неизменяемое (immutable) val для которого создается резервное поле (backing field), хранящее значение и два метода доступа: геттер и сеттер. val в отличие от var не позволяет использовать сеттер. Байт-код, сгенерированный для класса практически эквивалентен байт-коду, сгенерированному для java–класса. Разница только в инициализаторе свойства: он Null–безопасный.

 

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

 

Полный синтаксис для определения изменяемого свойства:

Инициализатор, геттеры и сеттеры опциональны. Тип свойства опционален, если он может быть выведен из инициализатора или из члена базового класса, который перегружен.

 

Заметьте. что типы не выводятся для свойств, которые используются как часть публичного API (public, protected), потому что инициализатор может вызвать непреднамеренное изменение публичного API.

 

Мы можем написать собственные методы доступа.

 

Свойства могут иметь резервные поля (backing field). $ используется для обращения к полю.

Обращение без использования резервного поля

Заметим, что обращение к $полю может быль прочитано или записано только внутри метода доступа и к нему может быть получен доступ только внутри конструктора. Компилятор смотрит, используется ли резервное поле, и генерирует его только в случае, если используется.

Если вы хотите сделать что-то, но не хочется использовать встроенные резервные поля, всегда можно использовать резервные свойства.

Официальная документация

5 комментариев:

  1. Заметим, что в этом примере вполне достаточно написать

    class ConfigFile {
    var seek : Long = 99999
    }

    get() и set() будут созданы автоматически.

    ОтветитьУдалить
  2. что за бум с этим котлином, стоящая штука?

    ОтветитьУдалить
  3. стоящая! Это такая scala, которая такая же простая как Java в изучении и понимании:)

    ОтветитьУдалить
  4. а кто знает как можно вырубить эти геттеры и сеттеры к черту? а то я уже устал искать ошибки из за них. Простой пример под андроидом:
    var transactionManager : TransactionManager? = null
    onCreate (....){
    ....
    transactionManager = getTransactionManager()
    }

    Так вот, getTransactionManager() возвращал всегда null, потому что, видите ли, сомпилятор думает что я обращаюсь к полю своего класса. А я пытаюсь вызвать метод класса предка. Не писать же везде super.getTransactionManager() ? Вся фишка простоты котлина пропадает.

    ОтветитьУдалить