java 枚举类型知识点记录
2016-05-18 18:02
609 查看
在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum。枚举类型是由一组固定的常量组成的类型。枚举本质是int值。因为枚举类型没有可以访问的构造器,所以枚举类型是真正的final。枚举的思想是:通过共有静态的final域为每个枚举常量导出实例类。enum实现了Serializable和Comparable接口。
最简单的enum类如下:
常量用逗号分隔,用分号结束。
enum有共有的方法name()和ordinal(),分别输出该常量的字符串名和枚举的序数。这个序数从0开始,是常量的位置,依次递增,所以这个值会跟随常量的位置而不同。所以这个方法不实用。一般需要定义自己的实例域。对以上代码改进如下:
注意,enum只能定义default或者private的构造器。这就说明enum不允许手动实例化。每次调用枚举中的常量时候,实际内部调用了构造器,这就是 上面所说的通过常量生成实例。
枚举有values方法,可以返回当前枚举类的所有常量。方法如下:
那么,我们可以为自定义的枚举做一些功能,例如根据name查找我们自定义的参数。例如:
还可以使用EnumSet放置枚举类型,生成枚举集合,EnumSet在java.util包中。并且实现了Collection和Serializable接口,继承了AbstractSet类,所以也实现了Set接口。示例如下:
枚举类型也提供了EnumMap类,它允许使用枚举作为它的键值,这样我们就能直接利用枚举存放map类型数据,而不用需要转换枚举类型到我们需要的数据了。EnumMap代码声明如下:
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Cloneable
从中看出key为枚举类型的。其中key值使用了泛型限制,使用extends Enum,保证了编译安全。
最简单的enum类如下:
public enum MyEnum { GREEN,BLUE,BLACK; }
常量用逗号分隔,用分号结束。
enum有共有的方法name()和ordinal(),分别输出该常量的字符串名和枚举的序数。这个序数从0开始,是常量的位置,依次递增,所以这个值会跟随常量的位置而不同。所以这个方法不实用。一般需要定义自己的实例域。对以上代码改进如下:
public enum MyEnum { GREEN(1),BLUE(2),BLACK(3); private MyEnum(int value){ } }
注意,enum只能定义default或者private的构造器。这就说明enum不允许手动实例化。每次调用枚举中的常量时候,实际内部调用了构造器,这就是 上面所说的通过常量生成实例。
枚举有values方法,可以返回当前枚举类的所有常量。方法如下:
public enum MyEnum { GREEN(1),BLUE(2),BLACK(3); private MyEnum(int value){ } public static void main(String[] args) { for (MyEnum myenum : MyEnum.values()) { System.out.println(myenum.name());//GREEN BLUE BLACK } } }
那么,我们可以为自定义的枚举做一些功能,例如根据name查找我们自定义的参数。例如:
public enum MyEnum { GREEN(1),BLUE(2),BLACK(3); private int value; private MyEnum(int value){ this.value = value; } public static int getValue(String name){ for (MyEnum myenum : MyEnum.values()) { if(myenum.name() == name){ return myenum.value; } } return 0; } public static void main(String[] args) { System.out.println(MyEnum.getValue(MyEnum.BLACK.name())+""); // 3 } }
还可以使用EnumSet放置枚举类型,生成枚举集合,EnumSet在java.util包中。并且实现了Collection和Serializable接口,继承了AbstractSet类,所以也实现了Set接口。示例如下:
public static void printColor(Set<MyEnum> colors){ for (MyEnum myEnum : colors) { System.out.println(myEnum.name()); } } public static void main(String[] args) { MyEnum.printColor(EnumSet.of(MyEnum.BLACK,MyEnum.BLUE)); //BLUE BLACK }
枚举类型也提供了EnumMap类,它允许使用枚举作为它的键值,这样我们就能直接利用枚举存放map类型数据,而不用需要转换枚举类型到我们需要的数据了。EnumMap代码声明如下:
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Cloneable
从中看出key为枚举类型的。其中key值使用了泛型限制,使用extends Enum,保证了编译安全。
相关文章推荐
- java常用类
- 详解java定时任务
- spring-quartz 定时任务
- 在intelliJ IDEA下在web项目中使用hibernate出现java.lang.ClassNotFoundException: org.hibernate.criterion.Criteri
- 彻底理解java语言的线程安全volatile用法
- java操作cookie用法总结
- 拦截器获取access_token
- Java clone
- java 合并文件
- JavaGC(3)-Java垃圾回收优化
- 解决Eclipse Debug source not found问题
- RxJava变换
- java 多线程
- java中FileInputStream,FileReader等的区别
- eclipse clean后不能自动编译生成class文件的问题
- 转解决java向pdf中写值
- java ThreadLocal 自己的一些见解
- Java 内部类种类及使用解析
- java web工程启动socket服务
- java.lang.IllegalStateException: Could not find a method false(View) in the activity class com.xuan