Kotlin枚举构造函数参数“必须初始化”,且伴随对象常量不带限定符名称

时间:2019-08-19 16:22:23

标签: 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'
  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"
  }
}

为什么指定限定符名称允许此代码编译?或换种说法,为什么 not 没有限定符名称会使代码无法编译?

2 个答案:

答案 0 :(得分:2)

companion object将在您的班级可用时实例化(编译时)。然后,您告诉您的类,要使其可用,它需要一个尚不可用的类(因为当前正在编译它,并且很明显,Kotlin使枚举用例在伴随对象之前可用)

我不能确定这是否是Kotlin所为,但为避免这种情况,请在此类之外声明常量。

答案 1 :(得分:0)

有两种解决方案:

  1. 将变量设为顶级声明(如@baguIO所述)
  2. 明确提及范围(使用CampsiteCategoryCode.TENT_CODE而非仅使用TENT_CODE