成员函数和属性之间的区别

时间:2019-05-28 04:53:50

标签: kotlin

有什么区别?

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

我不知道。

我希望它们是一样的。

2 个答案:

答案 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