前一阵子在学习【 单例模式 】的时候看到了enum实现单例的方法。就趁此机会复习下<Think In Java>中的enum的各种使用方式。
github:
【 https://github.com/cstriker1407/think_in_java 】
CONTENTS
SimpleEnums:
最简单的enum的代码如下。
public enum SimpleEnums{ Enum1, Enum2, }
EnumsWithFunc:
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实现了interface,这样可以再外部的调用中将参数设置为接口了,但是老感觉这样怪怪的。
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; } } }
调用方法:
private static void testfun_EnumWithInterfaces(EnumInter interfaces){ System.out.println(interfaces.getInfo()); }
EnumsWith2Interfaces:
双层enum的interface实现。
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里面加入抽象方法,每个实例去实现。
public enum AbstractEnum{ test { @Override public void Func() { System.out.println("func in enum"); } }; public abstract void Func(); }
AnotherEnum:
另外一种比较奇怪的enum的实现方式,参考网址见注释。
/* http://blog.csdn.net/chinakite/article/details/3237204 */ 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的值连续怎么办,一种很奇怪的写法。
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()); DistinctEnum lookupEnum = DistinctEnum.map.get(1); System.out.println(lookupEnum.getInt());
更新:
2013年10月19日15:33:52
增加一个比较有趣的枚举向下移动的思路,通过这个思路可以实现很多有意思的功能。
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]; } }
发表评论