首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

枚举种Enum,EnumSet,EnumMap

2012-09-02 
枚举类Enum,EnumSet,EnumMapEnumSet与HashSet相比,非常快。??public enum AlalmPoints{STAIR1, STAIR2, LOB

枚举类Enum,EnumSet,EnumMap

EnumSet与HashSet相比,非常快。

?

?

public enum AlalmPoints{STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2;}public class EnumSets{EnumSet<AlarmPoints> points =EnumSet.noneOf(AlarmPoint.class); //Enmpty setpoints.add(STAIR1);}

?

?

?

EnumMap ,它要求其中的键(key)必须来自已个enum.

由于enum本身的限制,所以EnumMap在内部可由数组实现。

因此EnumMap的速度很快。不过只能将enum的实例作为键

来调用put()方法,如果key不存在,则对应null.

其他的操作与使用一般的Map差不多。


interface Command{void actioin();}public class EnumMaps{public static void main(String[] args){EnumMap<AlarmPoints, Command> em = new EnumMap<AlarmPoints, Command>(AlarmPoints.class);em.put(KITCHEN, new Comman(){public void actioin(){System.out.println("Kitchen fire!");}});em.put(BATHROOM, new Comman(){public void actioin(){System.out.println("Bathroom fire!");}});for(Map.Entry<AlarmPoints, Command> e : em.entrySet()){system.out.println(e.getKey()+": ");e.getValue().action();}try{// If there;s no value for particular key;em.get(UTILITY).action();//AlarmPoints 没有 UTILITY}catch(Exception e){...}}}
?常量相关方法enum允许为enum实例编写方法, 从而为每个enum实例赋予各自不同的行为。 要实现常量的相关的方法,你需要为enum定义一个或多个abstract方法,然后为每个enum实例实现该抽象方法。
public enum ConstantSpecificMethod{DATE_TIME{String getInfo(){return DateFormat.getDateInstance().format(new Date());}},CLASSPATH{String getInfo(){return System.getenv("CLASSPATH");}},VERSION{String getInfo(){return Syste.getProperty("java.version");}};abstract String getInfo();public static void main(String[] args){for(ConstantSpecificMethod csm : values())System.out.println(csm.getInfo());}}通过相应的enum实例,我们可以调用其上的方法。 这通常也称为表驱动的代码在上面的例子中, enum实例视乎被当做"超类" ConstantSpecificMethod来使用,在调用getInfo()方法时,体现出多态的行为。然而, enum实例与类的相似之处也仅限于此。我们并不能真的将enum实例作为一个类型来使用enum LikeClass{WINKEN{void behavior(){sysout("B1")}},BLINKEN{void behavior(){sysout("B2")}},abstract void behavior();}public class NotClasses{// void f1(LikeClass.WINKEN insatnce){} //OPE }// Compiled form "NotClasses.java"abstract class LikeClasses extends java.lang.Enum{public static final LikeClasses WINKEN;public static final LikeClasses BLINKEN;public static final LikeClasses NOD;在方法f1()中,编译器不允许我们将以个enum实例当做class类型,分析下编译器生成的代码,就知道每个enum元素都是一个LikeClasses类型的static final实例。同时,由于他们是 static 实例,无法访问外部类的非static元素或方法,所以对于内部的enum的实例而言,行为跟一般的内部类并不相同。public class CarWash {public enum Cycle{UNDERBODY{void action(){ System.out.println("underbody");}},WHEELWASH{void action(){ System.out.println("Washing the wheels");}};abstract void action();}EnumSet<Cycle> cycles =EnumSet.of(Cycle.UNDERBODY, Cycle.WHEELWASH);public void washCar(){for(Cycle c : cycles)c.action();}public static void main(String[] args){CarWash wash = new CarWash();System.out.println(wash);wash.washCar();wash.cycles.add(Cycle.UNDERBODY);}}
?与使用匿名内部类相比, 定义常量相关方法的语法更高效,简洁。这个例子展示 EnumSet一些特性,因为她是一个恶集合,所以对一个元素而言,只能出现一次。想EnumSet添加的enum实例的顺序并不重要,因为其输出的次序决定于enum实例定义时的次序。
除了实现abstract方法外, 还可以覆盖常量的相关方法
public enum OverrideConstantSpecific{NUT, BOLT,WASHER{void f(){print("Overriden method");}};void f(){print("default method");}public static void mian(String[] args){for(OverrideConstantSpecific osc : values()){print(osc+":");ocs.f();}}}//outputNUT : default method;BOLT : default method;WASHER : Overriden method;
?

?

热点排行