Java系列2 枚举

2018-08-07  本文已影响0人  莫小归

参考: https://www.cnblogs.com/kailejun/p/6624471.html

一.概述

1.历史
2.枚举与常量类

二.源码及反编译

1.基础版
public enum ColorEnum {
    RED,BLUE,GREEN
}
public final class ColorEnum extends Enum
{

    //返回存储枚举实例的数组的副本。values()方法通常用于foreach循环遍历枚举常量。
    public static ColorEnum[] values()
    {
        return (ColorEnum[])$VALUES.clone();
    }
    //根据实例名获取实例
    public static ColorEnum valueOf(String s)
    {
        return (ColorEnum)Enum.valueOf(ColorEnum, s);
    }

    //私有构造方法,这里调用了父类的构造方法,其中参数s对应了常量名,参数i代表枚举的一个顺序(这个顺序与枚举的声明顺序对应,用于oridinal()方法返回顺序值)
    private ColorEnum(String s, int i)
    {
        super(s, i);
    }

    //我们定义的枚举在这里声明了三个 ColorEnum的常量对象引用,对象的实例化在static静态块中
    public static final ColorEnum RED;
    public static final ColorEnum BLUE;
    public static final ColorEnum GREEN;
    //将所有枚举的实例存放在数组中
    private static final ColorEnum $VALUES[];

    static 
    {
        RED = new ColorEnum("RED", 0);
        BLUE = new ColorEnum("BLUE", 1);
        GREEN = new ColorEnum("GREEN", 2);
        //将所有枚举的实例存放在数组中
        $VALUES = (new ColorEnum[] {
            RED, BLUE, GREEN
        });
    }
}
2.进阶版
public enum ColorEnum {
    RED("red","红色"),GREEN("green","绿色"),BLUE("blue","蓝色");
    //防止字段值被修改,增加的字段也统一final表示常量
    private final String key;
    private final String value;
    
    private ColorEnum(String key,String value){
        this.key = key;
        this.value = value;
    }
    //根据key获取枚举
    public static ColorEnum getEnumByKey(String key){
        if(null == key){
            return null;
        }
        for(ColorEnum temp:ColorEnum.values()){
            if(temp.getKey().equals(key)){
                return temp;
            }
        }
        return null;
    }
    public String getKey() {
        return key;
    }
    public String getValue() {
        return value;
    }
}
public final class ColorEnum extends Enum
{

    public static ColorEnum[] values()
    {
        return (ColorEnum[])$VALUES.clone();
    }

    public static ColorEnum valueOf(String s)
    {
        return (ColorEnum)Enum.valueOf(ColorEnum, s);
    }

    //构造方法在原基础上加上我们新增的两个形参
    private ColorEnum(String s, int i, String s1, String s2)
    {
        super(s, i);
        key = s1;
        value = s2;
    }

    //自定义方法,通过key值获得对应的枚举对象
    public static ColorEnum getEnumByKey(String s)
    {
        if(null == s)
            return null;
        ColorEnum acolorenum[] = values();
        int i = acolorenum.length;
        for(int j = 0; j < i; j++)
        {
            ColorEnum colorenum = acolorenum[j];
            if(colorenum.getKey().equals(s))
                return colorenum;
        }

        return null;
    }

    public String getKey()
    {
        return key;
    }

    public String getValue()
    {
        return value;
    }

    public static final ColorEnum RED;
    public static final ColorEnum GREEN;
    public static final ColorEnum BLUE;
    //我们自定义的两个字段
    private final String key;
    private final String value;
    private static final ColorEnum $VALUES[];

    static 
    {
        RED = new ColorEnum("RED", 0, "red", "\u7EFE\u3223\u58CA");
        GREEN = new ColorEnum("GREEN", 1, "green", "\u7F01\u80EF\u58CA");
        BLUE = new ColorEnum("BLUE", 2, "blue", "\u9483\u6FCA\u58CA");
        $VALUES = (new ColorEnum[] {
            RED, GREEN, BLUE
        });
    }
}

三.其他

1.常用方法
for(ColorEnum temp:ColorEnum.values())  {
     system.out.println(temp);
}
//返回
RED
GREEN
BLUE
ColorEnum red = ColorEnum.valueOf("RED");
上一篇 下一篇

猜你喜欢

热点阅读