使用什么代替这个枚举?
What to use instead of this enum?
关于网络中的许多参考资料,我发现在 android 中使用 enum 会严重影响性能。因此,对于更简单的 int
或 String
枚举,他们建议使用注释库 @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
吗?我认为在这种情况下,甚至 R8
和 Proguard
也无济于事,因为据我所知,它们只是帮助将枚举转换为 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.
}
关于网络中的许多参考资料,我发现在 android 中使用 enum 会严重影响性能。因此,对于更简单的 int
或 String
枚举,他们建议使用注释库 @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
吗?我认为在这种情况下,甚至 R8
和 Proguard
也无济于事,因为据我所知,它们只是帮助将枚举转换为 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.
}