【问题标题】:Kotlin: How to access field from another class?Kotlin:如何访问另一个类的字段?
【发布时间】:2018-06-14 13:10:28
【问题描述】:
package example

class Apple {
    val APPLE_SIZE_KEY: String = "APPLE_SIZE_KEY"
}

类:

package example

class Store {
     fun buy() {
      val SIZE = Apple.APPLE_SIZE_KEY
    }
}

错误:

“APPLE_SIZE_KEY”在“example.Apple”中有私有访问权限

但是official documentation描述的是,如果我们不指定任何可见性修饰符,则默认使用public

为什么会出现上述错误?

【问题讨论】:

标签: android android-studio variables kotlin access-modifiers


【解决方案1】:

如果您希望这是一个类级别属性而不是实例级别属性,您可以使用companion object

class Apple {
    companion object {
        val APPLE_SIZE_KEY: String = "APPLE_SIZE_KEY"
    }
}

fun useAppleKey() {
    println(Apple.APPLE_SIZE_KEY)
}

您当前拥有的是一个实例属性,您可以像这样使用它:

fun useInstanceProperty() {
    val apple = Apple()
    println(apple.APPLE_SIZE_KEY)
}

【讨论】:

  • const val 可以使用,因为类型是String,这样可以避免生成不必要的 getter。当然类型可以由编译器推断,所以:const val APPLE_SIZE_KEY = "APPLE_SIZE_KEY"
【解决方案2】:

您尝试做的是访问没有实例的类的值。以下是三种解决方案:

package example

object Apple {
    val APPLE_SIZE_KEY: String = "APPLE_SIZE_KEY"
}

由于objects 在 Kotlin 中的工作方式,您不需要实例化任何内容。

你也可以像这样实例化你的类:

package example

class Store {
     fun buy() {
      val SIZE = Apple().APPLE_SIZE_KEY
    }
}

在这个解决方案中,您还有一个 Apple 的对象,但 Apple 仍被声明为一个类。

第三个选项是伴生对象,其行为类似于 Java 中的静态变量。

package example

class Apple {
    companion object {
        val APPLE_SIZE_KEY: String = "APPLE_SIZE_KEY"
    }
}

【讨论】:

  • 提及@JvmStatic 可能会有所帮助,它可以从Java 代码启用正常的静态访问(Apple.APPLE_SIZE_KEY),而不是Apple.Companion.INSTANCE.APPLY_SIZE_KEY
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多