枚举是限定可能值的一种手段,使用枚举可以降低程序出错的几率,并可以提高代码的可读性与可维护性,java枚举并不是简单常量的集合,而是一个对象,其本质依然是类,所以java枚举除了提供了一系列相关值外,还提供了一些额外的功能,甚至还可以根据需求自行添加一些功能,
使用enum关键字定义的枚举,实际上就相当于定义一个类,此类继承了Enum类而已。
使用如下:
定义枚举需要使用关键字enum ,例如一个应用需要两种状态 ON ,OFF。则可以定义如下:
/* 枚举
*/
public enum EnumController {
ON,OFF //常量
}
使用:
定义完枚举后,就可以使用枚举名.枚举项的形式在代码中对定义的枚举进行使用。
public class UseEnum {
public static void main(String[] args) {
EnumController econ= EnumController.ON;
System.out.println(econ);
System.out.println(econ.name());
System.out.println(econ.ordinal());// 序号
//遍历枚举
EnumController [] s = econ.values();
for (int i = 0 ; i < s.length ;i++){
System.out.println(s[i]);
}
}
}
枚举中的常用方法:
name (): 返回枚举的名称。
ordinal();返回枚举在项在枚举中的序号。
values(); 返回当前枚举中定义的所有枚举项的集合。
getDeclaringClass (); 用于取得当前枚举值所在类的完整名称。
二:为枚举类添加构造方法和成员方法:
枚举是一种特殊的类,所以其也可以拥有自己的构造器,但是枚举的构造器不可以是public的,其原因在于该构造器是提供给枚举对象中的枚举项构造时使用的,并且每声明一个枚举项时使用这个构造器进行构造。
成员方法:
做法如同给枚举添加构造器一样,可以为枚举添加方法。
如下:
enum MyEnmu {
ON ("开",EnumController.ON),
OFF ("关",EnumController.OFF);
private String Summary;
private EnumController en;
private MyEnmu (String Summary,EnumController en ){
this.Summary = Summary;
this.en = en;
}
public String getSummary (){
return Summary;
}
public EnumController getState() {
return this.en;
}
}
通过以上观察得出:
通过以上机制,可以将枚举本身要表达的含义与其具体的信息很好的整合起来,杜绝了传统语言中含义与信息分离的的弊端。
测试如下:
public class Use2 {
public static void main(String[] args) {
for (MyEnmu em : MyEnmu.values()){
System.out.println(em);
System.out.println(em.getSummary());
System.out.println(em.getState());
}
MyEnmu em2 = MyEnmu.valueOf("ON");
System.out.println(em2);
System.out.println(em2.getSummary());
}
}
三: 枚举集合:
Java中的枚举是一个对象,枚举对象中的各种枚举项也是对象,在java中集合容器要求存储在其中的每一个成员均是对象,枚举做为一种特殊的类,java与而提供了专门的集合容器 EnumSet 和EnumMap。
Enumset :
用于保存枚举项的集合,在枚举项本身不互斥的情况下特别有用,例如:一个应用系统通常会有多中角色,而某些人承担多中角色,如果这些角色都是通过枚举定义,此时Enumset
可以将多中角色保存在一起,标识特定用户承担的全部角色。
其提供了很多可以产生EnumSet的实例方法。
如下:
/* 枚举
*/
public enum EnumController {
ON,OFF //常量
}
测试:
public class EnumSetDemo {
public static void main(String[] args) {
/*
* 创建一个包含指定元素类型的所有元素的枚举 set。
* EnumSet 的时间 和空间性能应该是很好的。
*/
EnumSet<EnumController > set = EnumSet.allOf(EnumController.class);
for ( EnumController enumController :set ){
System.out.println(enumController);
}
}
}
EnumMap:
必须使用枚举项作为其KEY的Map算法与普通的Map类似,枚举映射在内部表示为数组。此表示形式非常紧凑且高效。
使用如下:
public enum EnumController {
ON,OFF //常量
}
测试:
public class EnumMapDemo {
public static void main(String[] args) {
EnumMap< EnumController, String> map = new EnumMap<EnumController,String >(EnumController.class);;
map.put(EnumController.ON, "开");
map.put(EnumController.OFF,"关");
Set <EnumController> set=map.keySet();
for (EnumController enumController : set) {
System.out.println(enumController+"---"+map.get(enumController));
}
}
}
让枚举实现接口:
定义接口:
public interface Info {
public String getColor ();
}
2: 在枚举上实现接口
public enum EnumClor implements Info {
RED {
@Override
public String getColor() {
return "红色";
}
},
BLUE {
@Override
public String getColor() {
return "蓝色";
}
},
GREEN {
@Override
public String getColor() {
return "绿色";
}
};:
}
测试:
public class EnumClorTest {
public static void main(String[] args) {
System.out.println(EnumClor.GREEN.getColor());
}
}
原理分析:
enum的语法尽管和class文件的语法不一样,但经过编译后产生的二就是一个Class文件,该Class文件经过反编译实际上生成的是一个类,该类继承了java.lang.Enum<E>。因此可以吧enem看成是一个class,可以用来定义一些属性和方法。
特别注意:
enum 可以实现接口, 但是其不能够继承类,因为其本身就已经就继成了Enum 类。
枚举中如果定义一个对象的情况下,就类似与单例模式。