什么是枚举?
一个值只能是有限的几种类型,而不能是其他的任何类型。
例如开车的方向有几种:前、后、左、右!
1.1 声明方式及枚举常量
- 关键字:enum
- 枚举常量:即枚举类下的对象,每个枚举类包含0个到多个枚举常量。
1.1.1 声明
enum关键字在类头中的class关键字前面
enum class 类名{
...
}
1.1.2 枚举常量
枚举类中的每一个枚举常量都是一个==对象==,并且他们之间用逗号分隔。
/**
* 例:关于一个网络请求结果的枚举类
*/
enum class State{
/*
NORMAL : 正常
NO_DATA : 数据为空
NO_INTERNET : 网络未连接
ERROR : 错误
OTHER : 其他
*/
NORMAL,NO_DATA,NO_INTERNET,ERROR,OTHER
}
1.2 枚举构造方法
枚举类也是一个类,也可以有构造方法、属性、方法等。枚举常量都是一个对象,当构造方法有参数时,每个枚举常量也需要传入对应的值
例如:打印日志级别。小于DEBUG级别时打印。
enum class LogLevel(val value:Int){
ERROR(0),
WARN(1),
INFO(2),
DEBUG(3)
}
val logLevel = LogLevel.DEBUG
fun v(msg:String){
if (LogLevel.WARN.value <= logLevel.value){
println(msg)
}
}
v("错误提示")
打印结果
错误提示
1.3 枚举常量匿名类
- 枚举常量的匿名类,则必须提供一个抽象方法或者属性。且该方法定义在枚举类内部。而且必须在枚举变量的后面。
- 变量之间使用逗号(,)分割开。但是最后一个枚举变量必须使用分号结束。不然定义不了抽象方法。
- 面已经说过,每一个枚举常量就是一个对象。
例如日志打印级别可以采用属性的方式设置
enum class LogLevelF(){
RELEASE {
override val value: Int
get() = 0
override fun value() {
}
},
DEBUG {
override val value: Int
get() = 1
override fun value() {
}
};
abstract val value:Int
abstract fun value()
}
1.4 枚举使用
app状态
enum class AppState {
NOT_RUNNING,
FOREGROUND,
BACKGROUND
}
var appState: AppState = AppState.NOT_RUNNING
/**
* app进入前台调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForeground() {
"app进入前台".d()
appState = AppState.FOREGROUND
}
/**
* app进入后台调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackground() {
"app进入后台".e()
appState = AppState.BACKGROUND
}
/**
* 不会调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onAppDestroy() {
"app没运行".e()
appState = AppState.NOT_RUNNING
}
if (appState == AppState.FOREGROUND) {//只有在前台时才显示dialog
...
}
错误码
enum class ErrorCode {
/**
* 接口响应错误
*/
ERROR,
/**
* 网络错误
*/
NET_ERROR,
/**
* 接口响应数据为空
*/
EMPTY,
/**
* 请求接口需要登录
*/
NEED_LOGIN,
/**
* 请求受限的
*/
RESULT_LIMIT,
/**
* 类型转换错误
*/
CONVERTER_ERROR
}
when (code) {
ApiResult.ErrorCode.ERROR -> {
error?.invoke(message)
}
ApiResult.ErrorCode.NET_ERROR -> {
netError?.invoke(message.orEmpty())
}
ApiResult.ErrorCode.NEED_LOGIN -> {
needLogin?.invoke(message)
}
ApiResult.ErrorCode.RESULT_LIMIT -> {
error?.invoke(message)
showToast(message)
}
}