Лучший способ переопределить свойство как константу в Котлине - PullRequest
0 голосов
/ 07 октября 2018

Kotlin обеспечивает поддержку переопределения свойств.Мне интересно, как лучше переопределить свойство как постоянное значение.

Чтобы быть более конкретным, предположим, что абстрактное свойство val объявлено в суперклассе или интерфейсе:

// In a superclass or an interface
abstract val num : Int

В его подклассе есть, по крайней мере, два способа переопределить его:

// In its subclass
override val num : Int = 0

или

// In its subclass
override val num : Int get() = 0

Помимо двух, я также могусделать это в Java:

// In a superclass or an interface
abstract fun getNum() : Int

// In its subclass
override fun getNum() : Int = 0

В чем разница между тремя с точки зрения памяти и сгенерированного байт-кода?Какой из них лучше?

Есть ли еще лучшие способы или шаблоны в Kotlin для объявления свойств, которые должны быть переопределены как константы?

1 Ответ

0 голосов
/ 07 октября 2018

Есть функциональная разница.

Использование присваивания Вы инициализируете поле при создании объекта:

override val num : Int = 0

Это создает неявное конечное поле поддержки со значением 0 и метод получения, который всегда возвращает одно и то же значение.Это генерируется байт-кодом, декомпилированным в java:

private final int num;

public int getNum() {
   return this.num;
}

Второе объявление на самом деле является переопределением получателя , которое также является допустимым способом реализации свойства из интерфейса.Это не создает вспомогательное поле, поэтому ваше свойство может возвращать разные значения при каждом вызове (например, вызов метода):

override val num : Int get() = 0

Декомпилированный байт-код:

public int getNum() {
   return 0;
}
...