调查 properties在 Kotlin 中,这个概念对我来说有点新,所以我很好奇,声明私有(private) property
是否合法?是 field
(实例变量)?
最佳答案
您可以将属性视为您可以获得的值(并为可变的值设置),但它们可以具有自定义和可覆盖的行为,并且可能不会实际存储。所以属性不是字段。
在 Kotlin 中,所有成员属性,private
与否,可以有一个 backing field ,但这不是必需的。
var counter = 0
在这里,
0
被放入支持字段,并且该属性的行为就像一个字段:从中获取值返回存储在字段中的值,为其设置值只是将值存储到支持字段中。但这不是一个领域,例如对于 Java,它仍然是一对 getter 和 setter。没有自定义访问器的私有(private)属性 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
,但它会有不同的语义。
关于oop - 私有(private) 'property' 是 'field' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36226655/