有什么区别?
val isFinished: Boolean
get() = actor.actions.size == 0
fun isFinished() = actor.actions.size == 0
我不知道。
我希望它们是一样的。
答案 0 :(得分:3)
第一个语句定义一个属性,第二个语句定义一个方法。
假设您同时在类Foo
中定义了两者。
val foo = Foo()
if(foo.isFinished) {} // property
if(foo.isFinished()) {} // method - see () at invocation
在内部,这两个变体都调用一个函数。
答案 1 :(得分:1)
类属性
您的第一个示例是类property:
class MyClass {
val isFinished: Boolean
get() = actor.actions.size == 0
}
此属性定义(可选)显式get
方法,通常称为“ getter”。您也可以省略吸气剂并这样做:
class MyClass {
val isFinished: Boolean = (actor.actions.size == 0) //parens not necessary
}
如果省略,如最后一个示例所示,则该值将是一个常量值,不会在每次访问时重新计算。两种变体服务于不同的用例,但在大多数情况下,后者就足够了。
无论如何,对于此类的客户端,都可以这样访问属性:
val mc = MyClass()
mc.isFinished
这显示了访问Kotlin中的属性。
类成员函数
Kotlin中的函数还可以定义函数,这些函数可以称为成员函数。您的第二个示例演示了此功能:
class MyClass {
fun isFinished() = actor.actions.size == 0
}
定义成员函数类似于具有显式getter的属性,但对于客户端而言仍然不同,因为它们必须调用函数而不是访问属性:
val mc = MyClass()
mc.isFinished()
旁注
请注意,所示函数使用的表达式主体与以下块主体方法等效:
class MyClass {
fun isFinished() {
return actor.actions.size == 0
}
}
详细了解功能here。