Kotlin использует getter для переменной только для чтения - PullRequest
0 голосов
/ 24 декабря 2018

Есть ли причина, по которой мы используем get () для переменной val?

Я думаю, что следующий код не нужен

private val context: Context get() = ApplicationProvider.getApplicationContext<Context>()

Поэтому я изменил это значение на

private val context: Context = ApplicationProvider.getApplicationContext<Context>()

Какая будет разница при использовании get () для переменной только для чтения?

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Ссылка, предоставленная IntelliJ Amiya в комментарии, содержит всю необходимую информацию, но, в частности, для ответа на ваш вопрос:

get() = ... будет вызывать ApplicationProvider.getApplicationContext<Context>() каждый раз, когда к ней обращаются;просто = ... вызовет его один раз и сохранит, а затем вернет сохраненное значение при доступе.Какой из них вам нужен или являются ли они фактически эквивалентными (потому что, например, тело всегда возвращает одно и то же значение и достаточно быстро), зависит от контекста.

0 голосов
/ 24 декабря 2018

Вы имеете дело с двумя различными способами объявления свойств:

Свойство с вспомогательным полем

Если вы объявляете свойство context и назначаете его следующим образом:

private val context: Context = ApplicationProvider.getApplicationContext<Context>()

вы создали свойство с базовым полем .

ApplicationProvider.getApplicationContext<Context>() оценивается один раз, когда создается экземпляр класса.Поскольку context является неизменным (val) каждый раз, когда возвращается одно и то же значение (которое было назначено вызовом функции).

Свойство без вспомогательного поля

Если вы объявите context таким образом

private val context: Context get() = ApplicationProvider.getApplicationContext<Context>()

, вы создали свойство без вспомогательного поля.ApplicationProvider.getApplicationContext<Context>() будет оцениваться каждый раз при доступе к context.Значение, возвращаемое getter , может изменяться в зависимости от того, возвращает ли перенаправленный вызов функции что-то другое.

Что использовать?

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

  1. вы не можете быть уверены, что ApplicationProvider.getApplicationContext<Context>() всегда будет возвращатьто же значение, по крайней мере, в документации не упоминается, что явное
  2. перенаправление вызова функции не окажет существенного влияния на производительность
0 голосов
/ 24 декабря 2018

Для получателя нет необходимости определять get (), но требуется набор регистрационных значений.

Начиная с Kotlin 1.1, вы можете опустить тип свойства, если оно может быть выведено из получателя:

val isEmpty get() = this.size == 0  // has type Boolean

Если вам нужно изменить видимость средства доступа или аннотировать его, но не нужно менять реализацию по умолчанию, вы можете определить средство доступа, не задав его тело:

var setterVisibility: String = "abc"
private set // the setter is private and has the default implementation
var setterVisibility: String = "abc"
private set // the setter is private and has the default implementation

для получения более подробной информации см. Свойства и поля

...