Kotlin枚举构造函数参数';必须初始化';不带限定符名称的伴随对象常量

Kotlin枚举构造函数参数';必须初始化';不带限定符名称的伴随对象常量,kotlin,enums,Kotlin,Enums,此代码使用用于从伴随对象访问常量的限定名称成功编译: enum class CampsiteCategoryCode(val code: String) { TENT(CampsiteCategoryCode.TENT_CODE), // intellij says 'Redundant qualifier name' OTHER(CampsiteCategoryCode.OTHER_CODE), // intellij says 'Redundant qualifier name'

此代码使用用于从伴随对象访问常量的限定名称成功编译:

enum class CampsiteCategoryCode(val code: String) {
  TENT(CampsiteCategoryCode.TENT_CODE), // intellij says 'Redundant qualifier name'
  OTHER(CampsiteCategoryCode.OTHER_CODE), // intellij says 'Redundant qualifier name'
  LODGING(CampsiteCategoryCode.LODGING_CODE), // intellij says 'Redundant qualifier name'
  RV(CampsiteCategoryCode.RV_CODE); // intellij says 'Redundant qualifier name'

  override fun toString() = code

  companion object {
    const val TENT_CODE = "tent"
    const val OTHER_CODE = "other"
    const val LODGING_CODE = "lodging"
    const val RV_CODE = "rv"
  }
}
但是,没有限定符名称的同一代码编译失败:

enum class CampsiteCategoryCode(val code: String) {
  TENT(TENT_CODE), // Variable 'TENT_CODE' must be initialized
  OTHER(OTHER_CODE), // Variable 'OTHER_CODE' must be initialized
  LODGING(LODGING_CODE), // Variable 'LODGING_CODE' must be initialized
  RV(RV_CODE); // Variable 'RV_CODE' must be initialized

  override fun toString() = code

  companion object {
    const val TENT_CODE = "tent"
    const val OTHER_CODE = "other"
    const val LODGING_CODE = "lodging"
    const val RV_CODE = "rv"
  }
}

为什么指定限定符名称允许编译此代码?或者换句话说,为什么没有限定符名称会导致代码无法编译?

在类可用时(编译时),
伴随对象将被实例化。然后你告诉你的类,为了让它变得可用,它需要一个还不可用的类(因为你现在正在编译它,而且很明显,Kotlin在伴随对象之前使枚举用例可用)


我不能确定这是否是Kotlin的意图,但为了避免这种情况,请在此类之外声明常量,有两种解决方案:

  • 使变量成为顶级声明(如@baguIO所述)
  • 明确提及范围(使用
    CampsiteCategoryCode.TENT_code
    而不仅仅是
    TENT_code

  • 虽然这是一个很好的问题,但我不明白在您的案例中为什么需要同伴对象。
    TENT(“TENT”)
    有什么问题?@dyukha我需要在注释字符串中插入代码,它们需要是编译时常量。在使用此方法之前,我尝试了您建议的方法。顺便说一句,您可以在文件级别声明这些常量,这是一个极其重要的区别。我已经为此奋斗了好几天,却不知道为什么。显式地添加作用域似乎使编译器感到满意,但在运行时,当我尝试调用方法时失败:
    ExceptionInInitializerError
    位于java.base/java.util.ArrayList.forEach
    <代码>由以下原因引起:java.lang.NullPointerException
    ,该方法是在我试图调用的同伴上定义的。