java 枚举 enum 总结

    枚举之前定义常量就需要 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();
}


}

}

原文地址:https://www.cnblogs.com/caibixiang123/p/8624016.html