oop - 私有(private) 'property' 是 'field' 吗?

标签 oop kotlin

调查 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/

    相关文章:

    kotlin - 修饰符 'override' 不适用于 'getter'

    android - Kotlin 反射 : primaryConstructor not found with R8 obfuscation

    c++ - 在接口(interface)设计中应该总是返回一个指向类的指针吗?

    java - 如何用 RXJava 替换 Thread.sleep()

    java - 将属性绑定(bind)到从 JavaFx/TornadoFX 控件派生的值的正确方法

    c# - 虽然我可以在方法中更改自定义对象的属性,但我无法更改 Vector3(Unity、C#)的属性

    android - 使用 Ktor 反序列化 Json 数组的问题

    php - 使用 array_flip 函数后同一键缺少值

    c# - 封装一个私有(private)常量

    javascript - JS 属性作为同一对象的方法的返回值