【问题标题】:What to use instead of this enum?用什么来代替这个枚举?
【发布时间】:2021-10-21 20:02:22
【问题描述】:

关于网络中的许多引用,我发现在 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),
}

这就是枚举。现在看看反编译的类。

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 performance kotlin enums


【解决方案1】:

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

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

这就是它在密封类中的样子

 //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.

    }

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多