使用什么代替这个枚举?

What to use instead of this enum?

关于网络中的许多参考资料,我发现在 android 中使用 enum 会严重影响性能。因此,对于更简单的 intString 枚举,他们建议使用注释库 @TypeDef。但是,如果我有这样的枚举怎么办?

enum class Heroes(
    val heroName: String,
    val heroLevel: Int,
    val healthPoints: Int,
    val xpMultipleMax: Double
) {
    GLAZIER("Glazier", 1, 25, 1.2),
    ONYX("Onyx", 2, 35, 1.3),
    PARDUS("Pardus", 3, 50, 1.5),
    EAGLE_EYE("Eagle eye", 4, 70, 1.7),
    TORNADO("Tornado", 5, 100, 2.0)
}

这里可以应用@TypeDef吗?我认为在这种情况下,甚至 R8Proguard 也无济于事,因为据我所知,它们只是帮助将枚举转换为 int。但是,如果每个枚举都有多个参数,他们将如何将其转换为 int?


P.S. 我创建了一个具有单个整数值的枚举。 Proguard 已打开,但在反编译后,我发现它仍然在底层使用枚举。

enum class Heroes(
    val heroLevel: Int,
) {
    GLAZIER(1),
    ONYX(3),
}

这就是枚举。现在看看反编译后的 class.

public enum Heroes {
   GLAZIER,
   ONYX;

   private final int heroLevel;

   public final int getHeroLevel() {
      return this.heroLevel;
   }

   private Heroes(int heroLevel) {
      this.heroLevel = heroLevel;
   }
}

P.P.S 现在 Google 的人说可以使用枚举 - Source

您现在可以在 Android 中使用枚举。它对 ART 的性能影响不大。在 Google I/O 中进行了讨论 您可以参考此处的视频 Google IO SpeedLink to Enum topic

如果你想在 Kotlin 中替代枚举,当然,你总是可以使用 Sealed classes。

这是密封的样子 class

 //Enum version
 enum class Heroes(
        val heroName: String,
        val heroLevel: Int,
        val healthPoints: Int,
        val xpMultipleMax: Double
    ) {
        GLAZIER("Glazier", 1, 25, 1.2),
        ONYX("Onyx", 2, 35, 1.3),
        PARDUS("Pardus", 3, 50, 1.5),
        EAGLE_EYE("Eagle eye", 4, 70, 1.7),
        TORNADO("Tornado", 5, 100, 2.0)
    }
    //sealed class verison
    sealed class Heroes(
        val heroName: String,
        val heroLevel: Int,
        val healthPoints: Int,
        val xpMultipleMax: Double
    ) {
        class GLAZIER() : Heroes("Glazier", 1, 25, 1.2)
        class ONYX() : Heroes("Onyx", 2, 35, 1.3)
        class PARDUS() : Heroes("Pardus", 3, 50, 1.5)
        class EAGLE_EYE() : Heroes("Eagle eye", 4, 70, 1.7)
        class TORNADO() : Heroes("Tornado", 5, 100, 2.0) //use 'object' instead of 'class' if you want single instance.

    }