在Kotlin中查看properties,这个概念对我来说有些新鲜,所以我很好奇,说私有property
是field
是否合法(实例变量) )?
答案 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 = something
或val 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类没有字段,因此最好始终将属性称为属性。