参考:https://blog.csdn.net/qq_27093465/article/details/52180865
JDK1.5引入了新的类型—枚举
用法一:常量
在JDK1.5 之前,我们定义常量都是: public static final… 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
public enum Color {
RED, GREEN, BLANK, YELLOW
}
用法二:switch
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
用法三:向枚举中添加新方法 【常用】
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
【简化版】
package com.ssm.common.enums;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
/**
* 颜色枚举类
*/
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum ColorEnum {
RED("red", "红色"),
GREEN("green", "绿色"),
BLANK("blank", "白色"),
YELLO("yello", "黄色");
// 成员变量
private String name;
private String value;
// 将数据缓存到map中
private static final Map map = new HashMap();
static {
for (ColorEnum color : ColorEnum.values()) {
map.put(color.getName(), color.getValue());
}
}
// 根据name查询value值
public static String getValueByName(String name) {
return map.get(name);
}
}
【完整版】
package com.ssm.common.enums;
import java.util.HashMap;
import java.util.Map;
/**
* 颜色枚举类
*/
public enum ColorEnum {
RED("red", "红色"),
GREEN("green", "绿色"),
BLANK("blank", "白色"),
YELLO("yello", "黄色");
// 成员变量
private String name;
private String value;
// 构造方法
private ColorEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
// 将数据缓存到map中
private static final Map map = new HashMap();
static {
for (ColorEnum color : ColorEnum.values()) {
map.put(color.getName(), color.getValue());
}
}
// 根据name查询value值
public static String getValueByName(String name) {
return map.get(name);
}
}
用法四:覆盖枚举的方法
下面给出一个toString()方法覆盖的例子。
package com.ssm.common.enums;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
/**
* 颜色枚举类
*/
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum ColorEnum {
RED("red", "红色"),
GREEN("green", "绿色"),
BLANK("blank", "白色"),
YELLO("yello", "黄色");
// 成员变量
private String name;
private String value;
// 将数据缓存到map中
private static final Map map = new HashMap();
static {
for (ColorEnum color : ColorEnum.values()) {
map.put(color.getName(), color.getValue());
}
}
// 根据name查询value值
public static String getValueByName(String name) {
return map.get(name);
}
@Override
public String toString() {
return this.name + "_" + this.value;
}
}
用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
// 定义接口
public interface Behaviour {
void print();
String getInfo();
}
// 实现接口
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum ColorEnum implements Behaviour {
RED("red", "红色"),
GREEN("green", "绿色"),
BLANK("blank", "白色"),
YELLO("yello", "黄色");
// 成员变量
private String name;
private String value;
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.name + ":" + this.value);
}
}
用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
/**
* 测试继承接口的枚举的使用
*/
private static void testImplementsInterface() {
for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) {
System.out.print(dessertEnum + " ");
}
System.out.println();
// 我这地方这么写,是因为我在自己测试的时候,把这个coffee单独到一个文件去实现那个food接口,而不是在那个接口的内部。
for (CoffeeEnum coffee : CoffeeEnum.values()) {
System.out.print(coffee + " ");
}
System.out.println();
// 搞个实现接口,来组织枚举,简单讲,就是分类吧。如果大量使用枚举的话,这么干,在写代码的时候,就很方便调用啦。
// 还有就是个“多态”的功能吧,
Food food = Food.DessertEnum.CAKE;
System.out.println(food);
food = CoffeeEnum.BLACK_COFFEE;
System.out.println(food);
}
用法七:关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
关于枚举的实现细节和原理请参考:
参考资料:《ThinkingInJava》第四版
http://softbeta.iteye.com/blog/1185573