Java 枚举类型知识点

来源:互联网 发布:web系统数据暂存 编辑:程序博客网 时间:2024/06/04 01:33

1、创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum;

2、values():返回enum实例的数组;Enum类实现了Serializable接口和Comparable接口;name()方法返回enum实例声明时的名字,效果与toString()相同;valuesOf()是Enum的静态方法可以根据给定的名字返回相应的enum实例,如果不存在给定名字的实例,则会抛出异常。如果在enum实例上调用getDeclaringClass方法,我们就可以知道其所属的enum类。

3、除了不能继承自一个enum(因为编译器将枚举都标记为final了)之外,我们基本可以将enum看做是一个常规的类。也就是说我们可以向enum中添加方法。enum甚至可以有main方法,注意:如果你打算定义自己的方法,那么必须在enum实例序列的最后添加一个分号,即:public enum{a,b,c; 自定义的方法}。同时,Java要求你必须先定义enum实例,如果在定义enum实例之前定义了任何的属性或者方法,编译器将报错。

4、我们只能在enum定义的内部使用其构造器创建实例,一旦enum定义结束,编译器就不允许我们再使用其构造器来创建任何实例了。例如:

public enum TestEnum{

WEST("qqqqqq"),

SOUTH();

private String description;

TestEnum(String description){

this.description =  description;

}

}

enum的构造器与方法和普通的类没有区别,因为除了少许的限制之外,enum就是一个普通的类,所以,我们可以使用enum做很多事情(虽然,我们只使用普通的枚举类型)。

5、values()方法的神秘之处:编译器为我们创建的enum类都继承自Enum类。然而,如果你研究Enum类就会发现,并没有values这个方法。可我们明明可以使用values方法的,这是为什么呢?

答案是values是由编译器添加的static方法。

由于values()方法是由编译器插入到enum定义中的static方法,所以,如果你将enum实例向上转型为Enum,那么values()方法就不可访问了。不过,class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有enum实例。

6、所有的enum都继承自java.lang.Enum类,由于Java不支持多继承,所以在创建新的enum时,可以同时实现一个或多个接口。例如:public enum implements A,B{

}

7、使用接口组织枚举:在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组,可以达到将枚举元素分类组织的目的。

public interface Food{

enum AFood implements Food{a,b,c;}

enum BFood implements Food{a1,b1,c1;}

enum CFood implements Food{a2,b2,c2;}

}

另外,还有一种管理枚举的方法是将一个枚举嵌套在另一个enum内。

8、enum要求其成员是唯一的,并且不能从enum中删除或添加元素,所以它只能算是不太有用的集合。

9、使用EnumSet代替标志。Java SE5引入EnumSet,是为了通过创建一种替代品,以替代传统的基于int的“位标志”。EnumSet的优点是性能高,非常快。另外,EnumSet中的元素必须来自一个enum。EnumSet的基础是Long,一个long值是64位,而一个enum实例只需一位bit表示是否存在。也就是说,在不超过一个long的表达能力的情况下,你的EnumSet最多不超过64个元素的enum,如果超过64个,EnumSet也不会出现问题,应该是EnumSet在必要的时候增加了一个long。

10、EnumMap:要求Key必须来自一个enum,因此我们只能将enum实例作为键来调用put()方法,其他操作与使用一般的Map差不多。

11、常量相关的方法:Java的enum有一个很有趣的特性是允许程序员为enum实例编写方法,从而为每个enum实例赋予不同的行为。要实现常量相关的方法,需要为enum定义一个或多个abstract方法,然后为每个enum实例实现该抽象方法。示例:

public enum A{

DATE_TIME{

String getInfo(){

return ....;}

}

VERSION{

String getInfo(){

return ....;}

}

abstract String getInfo();

}

由此可以体现多态的行为。虽然如此,enum实例与类的相似之处也仅限于此。我们并不能真的将enum实例作为一个类型来使用。除了实现abstract方法,同样可以覆盖常量相关的方法。比如:

public enum A{

DATE_TIME{

String getInfo(){

return ....;}

}

String getInfo(){

return ....;};

}

12、enum职责链

public enum AHandler{

BEnum{

void handle(Mail m){

if (...)

 ....;

else

...;}

}

CEnum{

void handle(Mail m){

if (...)

 ....;

else

...;

}

}

abstract void handle(Mail m);

}

当调用AHandler的handle方法的时候,会依次调用BEnum和CEnum的handle方法,即如果BEnum可以处理,则交由BEnum处理,否则继续调用CEnum的handle方法,依次类推。Enum定义的次序决定了各个解决策略在应用时的次序。

13、Enum之多路分发(自行查阅相关资料);

原创粉丝点击