【2013-10-12】《Java编程思想》读书笔记:enum
·

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

所有评论(0)