使用枚举替代if else和switch
什么是枚举
枚举是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁,安全性以及便捷性。创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类(java.lang.Enum是一个抽象类)。枚举类型符合通用模式Class Enum>,而E表示枚举类型的名称。枚举类型的每一个值都映射到protected Enum(String name,int ordinal)构造函数中,在这里,每个值的名称都转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
为什么要使用枚举替代if else和switch
在日常开发中,经常会根据不同条件做不同的操作,一般使用最多就是if else和switch,但是过多的判断逻辑和业务代码会导致代码可读性和可扩展性变差,如果后期想再多一个条件,又要多写一条else;这时候我们可以使用接口(interface)和枚举(Enum)的组合写出更加优美的代码。
public static String animal(String name){
if ("cat".equals(name)){
return "猫";
}else if ("dog".equals(name)){
return "狗";
}else if ("pig".equals(name)){
return "猪";
}else {
return "啥也不是";
}
}
public static String animal(String name){
switch (name){
case "cat": return "猫";
case "dog": return "狗";
case "pig": return "猪";
default: return "啥也不是";
}
}
实现
先创建一个接口和一个枚举类,让这个枚举类实现这个接口
在接口中写一个抽象方法,因为枚举的每一项参数都是独立的,他们可以拥有自己的独立的构造,包括在实现接口时可以独立实现不同的功能
public interface AnimalApi {
String animal();
}
public enum AnimalEnum implements AnimalApi{
CAT("cat"){
@Override
public String animal() {
return "猫";
}
},
DOG("dog"){
@Override
public String animal() {
return "狗";
}
},
PIG("pig"){
@Override
public String animal() {
return "猪";
}
},
;
private String name;
AnimalEnum(String name) {
this.name = name;
}
/**
* 根据名称获取对应枚举类
*/
public static AnimalEnum get(String name){
for (AnimalEnum e : AnimalEnum.values()) {
if (e.name.equals(name)){
return e;
}
}
return null;
}
}
使用
在使用的时候只要使用get方法获取到对应的枚举类在使用 #animal 方法即可
public static void main(String[] args) {
System.out.println(AnimalEnum.get("cat").animal());//猫
System.out.println(AnimalEnum.get("dog").animal());//狗
System.out.println(AnimalEnum.get("pig").animal());//猪
}