Котлин: веселье против Валь - PullRequest
0 голосов
/ 01 марта 2019

Kotlin поддерживает computed properties, но я не уверен, когда их использовать.

Допустим, у меня есть класс:

class Car(val color: String)

и эта функция возвращает true, еслимашина белого цвета:

fun isWhite(car: Car): Boolean {
  return car.color == "WHITE"
}

Теперь я хочу, чтобы эта функция была member function, это выглядело бы так:

class Car(val color: String) {
  fun isWhite(): Boolean = color == "WHITE"
}

, но также может выглядеть так:

class Car(val color: String) {
  val isWhite: Boolean get() = color == "WHITE"
}

Так что же лучше?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Официальные Условные обозначения Kotlin определяют в разделе Функции против свойств следующее:

В некоторых случаях функции без аргументов могут быть взаимозаменяемыми с readсвойстваХотя семантика схожа, существуют некоторые стилистические соглашения о том, когда отдавать предпочтение одному другому.

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

  • не выбрасывает
  • дешево вычислить (или вызвать при первом запуске)
  • возвращает тот же результат при вызовах, если состояние объекта не изменилось

Так что ябудет использовать в приведенном выше примере val для isWhite, поскольку он не выбрасывает, сравнение строк является дешевым для вычисления и color из Car не может измениться, так как Car.color сам по себеопределяется как val.

Скомпилированная разница

Обратите внимание, что байт-код JVM блока get() будет скомпилирован в тот же код, что и функция,Таким образом, оба подхода из скомпилированного байт-кода одинаковы, и разницы в производительности нет .

0 голосов
/ 01 марта 2019

Личные предпочтения.

На мой взгляд, если вам не нужно ничего передавать, создайте его как свойство.

Но если вам нужно передать ему больше информации, это должна быть функция!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...