Kotlin:如何从另一个班级访问字段?

Mal*_*ngh 7 variables android access-modifiers kotlin android-studio

package example

class Apple {
    val APPLE_SIZE_KEY: String = "APPLE_SIZE_KEY"
}
Run Code Online (Sandbox Code Playgroud)

类:

package example

class Store {
     fun buy() {
      val SIZE = Apple.APPLE_SIZE_KEY
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:

'APPLE_SIZE_KEY'在'example.Apple'中拥有私人访问权限

但官方文档描述了如果我们不指定任何可见性修饰符,public则默认使用.

我的第二个问题是:

为什么会出现上述错误?

cre*_*not 17

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

package example

object Apple {
    val APPLE_SIZE_KEY: String = "APPLE_SIZE_KEY"
}
Run Code Online (Sandbox Code Playgroud)

这样,由于objectKotlin的工作方式,您无需实例化任何内容.

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

package example

class Store {
     fun buy() {
      val SIZE = Apple().APPLE_SIZE_KEY
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

package example

class Apple {
    companion object {
        val APPLE_SIZE_KEY: String = "APPLE_SIZE_KEY"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 提及 `@JvmStatic` 可能会有所帮助,它可以从 Java 代码启用正常的静态访问(`Apple.APPLE_SIZE_KEY`),而不是 `Apple.Companion.INSTANCE.APPLY_SIZE_KEY`。 (2认同)

zsm*_*b13 5

如果您希望将其作为类级别的属性而不是实例级别的属性,则可以使用伴随对象:

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

fun useAppleKey() {
    println(Apple.APPLE_SIZE_KEY)
}
Run Code Online (Sandbox Code Playgroud)

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

fun useInstanceProperty() {
    val apple = Apple()
    println(apple.APPLE_SIZE_KEY)
}
Run Code Online (Sandbox Code Playgroud)

  • 可以使用 `const val`,因为类型是 `String`,这避免了生成不必要的 getter。当然,编译器可以推断出类型,所以:`const val APPLE_SIZE_KEY = "APPLE_SIZE_KEY"` (2认同)