私人“财产”是“领域”吗?

时间:2016-03-25 19:29:53

标签: oop kotlin

在Kotlin中查看properties,这个概念对我来说有些新鲜,所以我很好奇,说私有propertyfield是否合法(实例变量) )?

2 个答案:

答案 0 :(得分:9)

您可以将属性视为获取的值(以及为可变的设置),但它们可以具有自定义和可覆盖的行为,并且可能实际上未存储。所以属性不是字段。

在Kotlin中,所有成员属性,private或不是{strong>可以一个backing field,但没有必要。

  • 带有支持字段的属性:

    var counter = 0 
    

    此处,0放入支持字段,属性的行为类似于字段:从中获取值会返回存储在字段中的值,并为其设置值只是将值存储到支持字段中。但它不是一个领域,例如对于Java来说,它仍然是一对getter和setter。

    私有属性没有自定义访问器are optimized并编译成字段以避免函数调用开销,但它更像是一个实现细节,添加自定义访问器也会改变访问的字节码该属性被编译成。

    var counter = 0
        get() = field + 1
        set(value) { if (value >= 0) field = value }
    

    此处该属性再次具有支持字段,但其行为不同,自定义访问者get()set(...)将在counter = somethingval x = counter等语句中执行。从内部和外部访问属性都是如此,private属性在这里没有区别。

    支持字段只能通过软关键字field直接在访问者代码中访问,而不会暴露给其他代码。如果要从其他位置访问支持值,则必须定义另一个backing property。您可以通过向属性添加@JvmField注释来向Java代码公开支持字段(这不会让它从Kotlin访问)。

  • 没有支持字段的属性

    如果某个属性没有初始值设定项且至少为get(),则该属性没有后备字段:

    val time: Long get() = System.currentTimeMillis()
    

    不会为它生成任何支持字段,但您可以使用其他属性作为支持属性,如上所述。

没有支持字段的属性也可以是extension properties,这距离字段很远:

val String.isCapitalized: Boolean get() = length > 0 && this[0].isUpperCase()     

这些也可以是private,但它会有不同的语义。

答案 1 :(得分:1)

不,因为" Kotlin中的课程不能有字段" (Properties and Fields - Kotlin Programming Language)。

此外,"如果您需要将Kotlin属性公开为Java中的字段,则需要使用@JvmField注释"进行注释。 (Calling Kotlin from Java - Kotlin Programming Language)。它仍然不是一个领域。

由于Kotlin类没有字段,因此最好始终将属性称为属性。