枚举之前定义常量就需要 public static fianl...,列如:
public static final int MONDAY =1;
public static final int TUESDAY=2;
public static final int WEDNESDAY=3;
public static final int THURSDAY=4;
public static final int FRIDAY=5;
public static final int SATURDAY=6;
public static final int SUNDAY=7;
上述的常量定义常量的方式称为int枚举模式,这样的定义方式并没有什么错,
但它存在许多不足,如在类型安全和使用方便性上并没有多少好处,如果存在定义int值相同的变量,
混淆的几率还是很大的,编译器也不会提出任何警告,
因此这种方式在枚举出现后并不提倡,现在我们利用枚举类型来重新定义上述的常量,同时也感受一把枚举定义的方式
//枚举类型,使用关键字enum enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
用法二:switch
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强:
enum Signal {
GREEN, YELLOW, RED
}
public class Stutent {
public void change(Signal color) {
switch (color) {
case RED:
color = Signal.GREEN;
System.out.println("sdsd");
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
用法三:向枚举中添加新属性
public enum Error {
BOLE_ERROR("无敌于天下", 1), BOLE_ERROR2("独孤求败", 2), BOLE_ERROR3("独孤求败3", 3);
private String name;
private Integer index;
private Error(String name, Integer index) {
this.name = name;
this.index = index;
}
public String getName() {
return name;
}
public Integer getIndex() {
return index;
}
}
只用get方法就行了,通过构造器赋值。
用法四:向枚举中添加相关的常量的方法
java 的enum有一个非常有趣的特性,即它允许程序员为enum实列编写方法,从而为每个enum实列赋予各自不同的行为。要实现相关的方法,你需要
为enum定义一个或者多个abstract方法,然后为每个实列实现该抽象方法:
public enum ConstantSpecificMethod {
DATE_TIME {
String getInfo() {
return DateFormat.getDateInstance().format(new Date());
}
},
CLASSPATH {
String getInfo() {
return System.getenv("CLASSPATH");
}
},
VERSION {
String getInfo() {
return System.getProperty("java.version");
}
};
abstract String getInfo();
public static void main(String[] args) {
System.out.println(ConstantSpecificMethod.DATE_TIME.getInfo());
}
}
用法五:实现接口
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}
用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
枚举集合EnumSet.向EnumSet添加enum实列的顺序并不重要,因为其输出的次序决定于enum实列定义时的次序,只能放枚举定义的类型,
enum FOOD {
APPLE, TTTT, AAAA, CCCC, DDDD
}
public class TestSet {
public static void main(String[] args) {
EnumSet<FOOD> set=EnumSet.noneOf(FOOD.class);
set.add(FOOD.APPLE);
set.add(FOOD.TTTT);
for (FOOD enum1 : set) {
System.out.println(enum1.name());
}
}
}
EnumMap的使用:
EnumMap是一种特殊的Map,它要求其中的键(key)必须来自一个enum.由于enum本身的限制,所以EnumMap在内部可由数组实现。因此EnumMap的速度很快,我们可以放心
地使用enum实列在EnumMap中进行查找操作。不过,我们只能将enum的实列作为键来调用put()方法,其他操作与使用一般的Map差不多。与EnumSet一样,enum实列定义
的次序决定了在其EnumMap中的顺序。
public class EnumMapps {
public static void main(String[] args) {
EnumMap<Color,Command> em=new EnumMap<Color,Command>(Color.class);
em.put(Color.BACK, new Command() {
@Override
public void action() {
System.out.println("Color.BACK ");
}
});
em.put(Color.GRREN, new Command() {
@Override
public void action() {
System.out.println("Color.GRREN ");
}
});
for(Map.Entry<Color, Command> e:em.entrySet()){
em.get(Color.BACK).action();
}
}
}