私人“财产”是“场”吗?

考虑到Kotlin的属性 ,这个概念对我来说有些新颖,所以我很好奇,说私有property是一个field (实例变量)是合理的吗?

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

在Kotlin,所有成员的财产,不论是否private都可以有一个后台领域 ,但是没有必要。

  • 属性与支持领域:

     var counter = 0 

    在这里, 0被放入后台字段,属性的行为就像一个字段 :从中获取一个值返回存储在该字段中的值,为其设置一个值,只将值存储到后台字段中。 但是这不是一个领域,例如对于Java而言,它仍然是一对吸气者和二传手。

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

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

    这里的属性也有一个支持字段,但是它的行为是不同的,自定义访问器get()set(...)将在诸如counter = somethingval x = counter类的语句中执行。 对于从内部和外部访问房产都是如此, private房产在这里并没有什么不同。

    后台字段只能在访问者代码中通过软关键字field直接访问,而不会暴露给其他代码。 如果您想要从其他位置访问备份值,则必须定义另一个备份属性 。 您可以通过向属性添加@JvmField批注(这不会使其可从Kotlin访问)将背景字段公开给Java代码。

  • 没有后台的属性

    当一个属性没有初始化并且至少有get() ,它是一个没有后备字段的属性:

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

    它不会生成后台字段,但是您可以使用另一个属性作为上述的后台属性。


没有后台字段的属性也可以是扩展属性 ,与字段相差甚远:

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

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

不,因为“Kotlin中的类不能有字段”( 属性和字段 – Kotlin编程语言 )。

另外,“如果需要将Kotlin属性公开为Java中的字段,则需要使用@JvmField批注@JvmField批注”( 从Java调用Kotlin – Kotlin编程语言 )。 但它仍然不是一个领域。

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

    Interesting Posts