在这里插入图片描述

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间: 2013-10-12 | 标题:《Java编程思想》读书笔记:enum | 分类: 编程 / java / think_in_java | 标签: java · enum · think in java


复习 《Think In Java》 中 enum 的各种使用方式(结合单例模式中发现 enum 可实现单例的契机)。

GitHub:think_in_java

SimpleEnums:最简单的 enum

public enum SimpleEnums {
    Enum1,
    Enum2,
}

EnumsWithFunc:带成员变量和方法的 enum

enum 在 Java 中本质上是一个类,因此可以有成员变量和方法,这也是 enum 可作为单例实现方式的原因。

public enum EnumsWithFunc {
    XiaoMing(10, "yinianji"), /* 实例必须是第一个 */
    ZhangSan(12, "ernianji"); /* 最后一个实例后面是 ';' */

    private int age;
    private String des;

    private EnumsWithFunc(int age, String des) { /* 构造方法标识符为 private */
        this.age = age;
        this.des = des;
    }

    public String showInfo() {
        return "Age:" + age + "  " + des;
    }
}

EnumInter:enum 实现接口

public interface EnumInter {
    public String getInfo();

    enum Phone implements EnumInter {
        HW("dalu"), SAMSUNG("waiguo");
        private String info;
        private Phone(String info) { this.info = info; }
        @Override public String getInfo() { return info; }
    }

    enum PC implements EnumInter {
        IBM("I"), APPLE("A");
        private String info;
        private PC(String info) { this.info = info; }
        @Override public String getInfo() { return info; }
    }
}

调用方式(参数类型为接口,可传入任意实现该接口的 enum 实例):

private static void testfun_EnumWithInterfaces(EnumInter interfaces) {
    System.out.println(interfaces.getInfo());
}

EnumsWith2Interfaces:双层 enum 接口实现

public enum EnumsWith2Interfaces {
    Phone(InterfaceEnum.Phone.class),
    PC(InterfaceEnum.PC.class);

    private InterfaceEnum[] values;
    private EnumsWith2Interfaces(Class<? extends InterfaceEnum> kind) {
        this.values = kind.getEnumConstants();
    }

    public InterfaceEnum[] getValues() { return values; }

    public interface InterfaceEnum {
        public String getInfo();

        enum Phone implements InterfaceEnum {
            HW("dalu"), SAMSUNG("waiguo");
            private String info;
            private Phone(String info) { this.info = info; }
            @Override public String getInfo() { return info; }
        }

        enum PC implements InterfaceEnum {
            IBM("I"), APPLE("A");
            private String info;
            private PC(String info) { this.info = info; }
            @Override public String getInfo() { return info; }
        }
    }
}

AbstractEnum:enum 内的抽象方法

enum 本质是类,可以在 enum 中定义抽象方法,每个实例分别实现:

public enum AbstractEnum {
    test {
        @Override
        public void Func() {
            System.out.println("func in enum");
        }
    };

    public abstract void Func();
}

AnotherEnum:用类模拟 enum(不推荐)

另一种奇特的实现方式,参考:CSDN - AnotherEnum

public class AnotherEnum {
    public static final AnotherEnum enum1 = new AnotherEnum(1);
    public static final AnotherEnum enum2 = new AnotherEnum(2);
    public static final AnotherEnum enum3 = new AnotherEnum(3);

    private int i;
    private AnotherEnum(int i) { this.i = i; }
}

DistinctEnum:非连续值的 enum

通过构造函数传入自定义整数值,并用 HashMap 实现反向查找:

public enum DistinctEnum {
    First(1),
    Second(2),
    Fifth(5);

    public static final HashMap<Integer, DistinctEnum> map = new HashMap<Integer, DistinctEnum>();
    static {
        for (DistinctEnum item : DistinctEnum.values()) {
            map.put(item.i, item);
        }
    }

    private int i;
    private DistinctEnum(int i) { this.i = i; }

    public int getInt() { return i; }
}

调用方式:

DistinctEnum testDistinctEnum = DistinctEnum.Fifth;
System.out.println(testDistinctEnum.getInt()); // 5

DistinctEnum lookupEnum = DistinctEnum.map.get(1);
System.out.println(lookupEnum.getInt()); // 1

更新(2013-10-19):枚举循环移动

通过 ordinal() 和取模实现 enum 的循环切换,可用于状态轮转场景:

private static enum SpeedSelEnum {
    MIN("MIN"),
    MAX("MAX"),
    AVG("AVG"),
    CUR("CUR");

    private String speedDes;
    private SpeedSelEnum(String speedDes) { this.speedDes = speedDes; }

    public String getSpeedDes() { return speedDes; }

    public SpeedSelEnum getNext() {
        int len = SpeedSelEnum.values().length;
        int newIdx = (this.ordinal() + 1) % len;
        return SpeedSelEnum.values()[newIdx];
    }
}

更多推荐