Разница между функцией-членом и свойством - PullRequest
0 голосов
/ 28 мая 2019

В чем разница?

val isFinished: Boolean
        get() = actor.actions.size == 0
fun isFinished() = actor.actions.size == 0

Понятия не имею.

Я ожидаю, что они будут такими же.

Ответы [ 2 ]

3 голосов
/ 28 мая 2019

Первый оператор определяет свойство, а второй оператор определяет метод. Предположим, вы определили оба в классе Foo.

val foo = Foo()
if(foo.isFinished) {} // property

if(foo.isFinished()) {} // method - see () at invocation

Под капотом оба варианта вызывают функцию.

1 голос
/ 28 мая 2019

Класс недвижимости

Ваш первый пример - класс свойство :

class MyClass {
    val isFinished: Boolean
        get() = actor.actions.size == 0
}

Это свойство определяет (необязательный) явный get метод, часто называемый «получателем». Вы также можете опустить геттер и сделать:

class MyClass {
    val isFinished: Boolean = (actor.actions.size == 0) //parens not necessary
}

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

Независимо от того, для клиента этого класса, свойство может быть доступно следующим образом:

val mc = MyClass()
mc.isFinished

Показывает доступ к недвижимости в Котлине.


Функция члена класса

Функции в Kotlin также могут определять функции, которые могут упоминаться как функции-члены. Ваш второй пример демонстрирует эту функцию:

class MyClass {
    fun isFinished() = actor.actions.size == 0
}

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

val mc = MyClass()
mc.isFinished()

Примечание на стороне

Обратите внимание, что показанная функция использует тело выражения, которое эквивалентно следующему подходу тела блока:

class MyClass {
   fun isFinished() { 
       return actor.actions.size == 0
   }
}

Подробнее о функциях здесь .

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