枚举
1.定义一个枚举
javap TestEunm 反编译class文件
*枚举类继承了java.lang.Enum,由于java不支持多继承,所以Enum不能继承其他类,可以实现多个接 口, enum是final的。
*每个枚举常量其实就是自定义的类的类型。
*values()和valueOf并不在java.lang.Enum,编译器为其增加了静态的valuse()和valueOf()方法。
values(); 返回enum实例的数组
valueOf(java.lang.String); 获取指定的枚举常量
*class中有一个getEnumContants()方法,可以对不是枚举的类调用此方法从而获取类中的枚举常量数组。
Enum部分类方法说明:
ordinal() 返回枚举常量定义的顺序序号
name() 返回枚举常量名称
2.在枚举中定义属性和方法
1、每个枚举值相当于一个实例,我们每声明一个枚举值就相当于创建了一个class的实例,我们在枚举类中定义的方法、属性信息在每个枚举值的实例中都存在,需要在枚举类中定义相应的构造函数,否则会产生编译器错误(缺少构造函数)。
3.枚举的枚举
1.在最外层的枚举中,定义了若干个枚举常量,在构造函数中说明该枚举只能接收 Food以及Food的子类型的类类型作为参数,Food是一个接口,其中定义了若干个枚举类,表示这些枚举类都是Food的子类型,其语意为Meal中包含了一些枚举常量,而这些枚举常量的构造器参数传的是一个枚举类型。
2.接口中也可以约定枚举方法。
3.Enums的random()方法限定了返回值的上限是Eunm类型,可以理解为所有的枚举类型都被向上转型为Enum类型,而Enum并不具备values()方法,所以我们只能使用 Class的getEnumContants()方法来达到与values()相同的效果。
4.常量相关方法
enum允许程序员为enum实例编写方法,从而为每个eunm实例赋予各自不同行为,你需要在enu中定义一个或多个abstract方法。
面向对象程序设计中不同的行为与不同的类关联,而通过枚举常量的相关方法,每个enum常量都具备了自己独特的行为,这似乎每个枚举常量都是一个独特的类,而这些类似乎有继承了ConstantSpecificMethod类。然而这只是他们的相似之处,我们不能真的将enum当做一个类型来使用。
原因是由于每个枚举常量都是static final类型的,参考TestEnum反编译结果,由于他们都是static实例,NotClasses无法访问外部类的非static的元素或方法。
我们可以扩展LikeClasses中的枚举常量,使其具备更多的行为,这样做可以使我们的控制逻辑代码与业务逻辑代码分离,也符合软件设计的开闭原则。
5.枚举实现单例模式
6.枚举实现策略模式
7.枚举实现责任链模式
8.枚举集合
EnumSet是一个存放枚举类型的set容器,与set类似,出现重复元素存贮时只会保留一个,EnumSet非常快速高效。EnumSet内部由数组实现,添加枚举常量的顺序决定了枚举常量在EnumSet中的顺序。
EnumSet常用方法
noneOf(Class<E> elementType) 生成一个指定枚举类型的空集合
complementOf(EnumSet<E> s) 顾名思义complement是补充的意思,可以创建一个EnumSet的补集
EnumSet是Set接口的一个实现,具备add addAll remveAll 等Set集合的通用方法
EnumMap是一个特殊的Map,它的key必须是一个 Enum常量,EnumMap内部由一个数组实现,所以enum实例定义的顺序决定了它在EnumMap中的顺序,EnumMap也非常的高效。
-------------------------------------------------End------------------------------------------------------
以上内容全部是个人理解,如果错误或不足之处请大家指正,欢迎大家讨论交流。
参考资料
《Java编程思想》
版权声明: 本文为 InfoQ 作者【小王同学】的原创文章。
原文链接:【http://xie.infoq.cn/article/dce3413febedace26e14d0220】。文章转载请联系作者。
评论