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

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

Я понятия не имею.

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

0
Sandra 28 Май 2019 в 07:53

2 ответа

Лучший ответ

Свойство класса

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

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
   }
}

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

1
s1m0nw1 28 Май 2019 в 08:31

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

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

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

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

3
Rene 28 Май 2019 в 05:03