天天看點

Kotlin中枚舉

一、寫一個Kotlin的枚舉

package net.println.kotlin.chapter4

/**
 * @author:wangdong
 * @description:
 */
enum class LogLevel{
    VERBOSE,DEBUG,INFO,WARN,ERROR,ASSERT
}           

二、看一下位元組碼

三、看一下kotlin反編譯成Java的代碼

package net.println.kotlin.chapter4;

import kotlin.Metadata;

@Metadata(
   mv = {1, 1, 9},
   bv = {1, 0, 2},
   k = 1,
   d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0010\n\u0002\b\b\b\u0086\u0001\u0018\u00002\b\u0012\u0004\u0012\u00020\u00000\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002j\u0002\b\u0003j\u0002\b\u0004j\u0002\b\u0005j\u0002\b\u0006j\u0002\b\u0007j\u0002\b\b¨\u0006\t"},
   d2 = {"Lnet/println/kotlin/chapter4/LogLevel;", "", "(Ljava/lang/String;I)V", "VERBOSE", "DEBUG", "INFO", "WARN", "ERROR", "ASSERT", "production sources for module chapter4_main"}
)
public enum LogLevel {
   VERBOSE,
   DEBUG,
   INFO,
   WARN,
   ERROR,
   ASSERT;
}
           

三、枚舉

執行個體可數的類,注意枚舉也是類

可以修改構造,添加成員

可以提高代碼的表現性,但是也會有一定的消耗(可以忽略不計)

看一個kotlin的枚舉類

package net.println.kotlin.chapter4

/**
 * @author:wangdong
 * @description:kotlin枚舉
 */
enum class LogLevel(val id: Int){
    VERBOSE(0),DEBUG(1),INFO(2),WARN(3),ERROR(4),ASSERT(5);
    //定義方法的時候,需要和上面的一行用分号隔開
    fun getTag(): String{
        return "$id,$name"
    }

    override fun toString(): String {
        return "$name,$ordinal"
    }
}

fun main(args: Array<String>) {
    println(LogLevel.DEBUG.getTag())  //1,DEBUG
    LogLevel.values().map(::println)    //VERBOSE,0DEBUG,1INFO,2WARN,3ERROR,4ASSERT,5
    println(LogLevel.valueOf("ERROR"))
}

/**寫一個帶構造器的類*/
class LogLevel2 protected constructor(){

    //伴生對象
    companion object {
        val VERBOSE = LogLevel2()
        val DEBUG = LogLevel2()
        val INFO = LogLevel2()
        val WARN = LogLevel2()
        val ERROR = LogLevel2()
    }
}