什么是枚舉度硝?
一個值只能是有限的幾種類型凌简,而不能是其他的任何類型上炎。
例如開車的方向有幾種:前、后雏搂、左藕施、右!
1.1 聲明方式及枚舉常量
- 關鍵字:enum
- 枚舉常量:即枚舉類下的對象凸郑,每個枚舉類包含0個到多個枚舉常量裳食。
1.1.1 聲明
enum關鍵字在類頭中的class關鍵字前面
enum class 類名{
...
}
1.1.2 枚舉常量
枚舉類中的每一個枚舉常量都是一個==對象==,并且他們之間用逗號分隔芙沥。
/**
* 例:關于一個網(wǎng)絡請求結果的枚舉類
*/
enum class State{
/*
NORMAL : 正常
NO_DATA : 數(shù)據(jù)為空
NO_INTERNET : 網(wǎng)絡未連接
ERROR : 錯誤
OTHER : 其他
*/
NORMAL,NO_DATA,NO_INTERNET,ERROR,OTHER
}
1.2 枚舉構造方法
枚舉類也是一個類诲祸,也可以有構造方法、屬性而昨、方法等救氯。枚舉常量都是一個對象,當構造方法有參數(shù)時歌憨,每個枚舉常量也需要傳入對應的值
例如:打印日志級別着憨。小于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 枚舉常量匿名類
- 枚舉常量的匿名類务嫡,則必須提供一個抽象方法或者屬性享扔。且該方法定義在枚舉類內(nèi)部底桂。而且必須在枚舉變量的后面。
- 變量之間使用逗號(,)分割開惧眠。但是最后一個枚舉變量必須使用分號結束籽懦。不然定義不了抽象方法。
- 面已經(jīng)說過氛魁,每一個枚舉常量就是一個對象暮顺。
例如日志打印級別可以采用屬性的方式設置
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狀態(tài)
enum class AppState {
NOT_RUNNING,
FOREGROUND,
BACKGROUND
}
var appState: AppState = AppState.NOT_RUNNING
/**
* app進入前臺調(diào)用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForeground() {
"app進入前臺".d()
appState = AppState.FOREGROUND
}
/**
* app進入后臺調(diào)用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackground() {
"app進入后臺".e()
appState = AppState.BACKGROUND
}
/**
* 不會調(diào)用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onAppDestroy() {
"app沒運行".e()
appState = AppState.NOT_RUNNING
}
if (appState == AppState.FOREGROUND) {//只有在前臺時才顯示dialog
...
}
錯誤碼
enum class ErrorCode {
/**
* 接口響應錯誤
*/
ERROR,
/**
* 網(wǎng)絡錯誤
*/
NET_ERROR,
/**
* 接口響應數(shù)據(jù)為空
*/
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)
}
}