前言
曾一直纠结于该不该在 Android 中使用枚举类,网上也是众说纷纭。至于官方曾给出的建议「枚举通常会比静态常量多两倍以上的内存占用,所以你应该应该的避免在 Android 中使用枚举」,那是 Android 刚发布的时候的建议,很多人一直被这句话影响着,避免使用枚举。但是对于简单的枚举来说,Proguard 是可以将其优化为整形的,所以可以尽管放心使用。对于其他场景下,大家可以酌情处理,毕竟现在 Android 手机动辄几个G的内存,少量使用也不会影响到多少性能的。
enum class Color {
RED, WHITE, BLACK, BLUE, GREEN, GRAY
}
// 可以放心使用,Proguard 是可以将其优化为整形
在 Proguard 时,若要将枚举转换成 Int 值,需要在 Proguard 文件中加入第一行,并且不能有
-dontoptimize
指令
-optimizations class/unboxing/enum
1. 复杂使用,方便逻辑处理
enum class UserType(val typeCode: Int, val tabIndex: Int) {
GUEST(1001, 0),
NORMAL(1002, 1),
VIP(1003, 2),
SVIP(1004, 3),
}
2. 常量
- 常量池
const val Status_OK = 1
const val Status_Fail = 2
const val Status_Empty = 3
const val Status_End = 4
@IntDef(Status_OK, Status_Fail, Status_Empty, Status_End)
@Retention(AnnotationRetention.SOURCE) // 注解仅保留在源码,不被编译到 .class 文件中
annotation class NetStatus
- 使用
private fun convertNetStatus(@NetStatus netStatus: Int): String {
return when (netStatus) {
Status_OK -> "正常"
Status_Fail -> "失败"
Status_Empty -> "数据数据为空"
else -> "到达结尾"
}
}