Enum枚举的原理及各种使用方法

看代码和注释,很简单明了

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 等级枚举
 *
 * @author wb-jjb318191
 * @create 2017-11-20 10:01
 */
public enum Level {

    DIAMOND("钻石", 10) {
        @Override
        public float getDiscount() {
            return 0.88f;
        }

        @Override
        public String toString() {
            return "label:"+name()+",折扣:"+getCode();
        }
    },

    PLATINUM("铂金", 8) {
        @Override
        public float getDiscount() {
            return 0.9f;
        }
    },

    GOLE("黄金", 6) {
        @Override
        public float getDiscount() {
            return 0.92f;
        }
    },

    SILVER("白银", 4) {
        @Override
        public float getDiscount() {
            return 0.94f;
        }
    },

    COPPER("青铜", 2) {
        @Override
        public float getDiscount() {
            return 0.96f;
        }
    },

    COMMON("普通", 0) {
        @Override
        public float getDiscount() {
            return 0.98f;
        }
    };

    private String label;
    private Integer code;

    private static final Map VALUES = new LinkedHashMap();

    Level(String label, Integer code) {
        this.label = label;
        this.code = code;
    }

    static {
        for (Level level : Level.values()) {
            VALUES.put(level.code, level);
        }
    }

    public static Level valueOf(Integer code) {
        return VALUES.get(code);
    }

    /**
     * 获取折扣
     *
     * @return
     */
    public abstract float getDiscount();

    public String getLabel() {
        return label;
    }

    public Integer getCode() {
        return code;
    }
}

使用方法及原理说明:

import org.junit.Test;

/**
 * 枚举类型测试用例
 * 每一个枚举类相当于{@link Level}的内部类,继承了外部类{@link Level},而枚举Level则继承了{@link Enum}类
 * Enum中很多方法都是final的,不能被重写,只有一个toString()可以被重写
 *
 * @author wb-jjb318191
 * @create 2017-11-20 9:58
 */
public class EnumTest {

    /**
     * Enum内置了一个valueOf(String)的函数,通过枚举的名称来映射枚举实例
     * 同时我们定义了一个valueOf(Integer)的函数,通过code来映射枚举实例
     * {@link Enum#valueOf(String)}
     * {@linkplain Level#valueOf(Integer)}
     */
    @Test
    public void testValueOf() {
        String common = Level.COMMON.toString();
        Level level0 = Level.valueOf(common);
        Level level1 = Level.valueOf(0);
        System.out.println(common);
        System.out.println(level0 == level1);
    }

    /**
     * 每一个枚举都有name和ordinal两个属性,name是枚举的名称,ordinal是枚举的顺序,按照定义顺序来,第一个是0,依次加1
     */
    @Test
    public void testGetName() {
        for (Level level : Level.values()) {
            System.out.println(level.ordinal());
            System.out.println(level.name());
        }
    }

    /**
     * Enum的toString()方法输出的是枚举的名称,这个方法是唯一能被重写的方法
     * {@link Enum#toString()}
     */
    @Test
    public void testToString() {
        for (Level level : Level.values()) {
            System.out.println(level.toString());
        }
    }

    /**
     * 每一个枚举实例可以重写外部枚举的方法,也可通过getSuperclass()方法获取去父类类对象
     */
    @Test
    public void testGetDiscount() {
        for (Level level : Level.values()) {
            System.out.println(level.getDiscount());
            System.out.println(level.getClass().getName());
            System.out.println(level.getClass().getSuperclass().getName());
            System.out.println(level.getClass().getSuperclass().getSuperclass().getName());
        }
    }

}

你可能感兴趣的:(jdk)