有些场景下,根据某个key值 去决定调用哪个方法, 除了if else之外
定义在枚举里面也是一种方式 ,比 if else 好用
有两种实现,一种是抽象方法 ,如下
package com.souche.sfs.server;
import java.util.function.Function;
public enum MethodEnum {
//定义方法1 以及其对应的code ,然后实现其抽象方法
Method1(1) {
@Override
void run() {
System.out.println("第一个方法");
}
},
//定义方法2 以及其对应的code 然后实现其抽象方法
Method2(2) {
@Override
void run() {
System.out.println("第二个方法");
}
};
//寻找符合的code来执行其方法
static public void runMethod(Integer code) {
for (MethodEnum methodEnum : MethodEnum.values()) {
if (methodEnum.getCode().equals(code)) {
methodEnum.run();
}
}
}
public Integer getCode() {
return code;
}
MethodEnum(Integer code) {
this.code = code;
}
//定义枚举的code
private Integer code;
//枚举的code对应的方法 定义成抽象的 然后在定义枚举值的时候实现
abstract void run();
}
运行结果
public static void main(String[] args) {
//指定枚举值调用
MethodEnum.Method1.run();
MethodEnum.Method2.run();
// 根据code调用
MethodEnum.runMethod(2);
}
执行结果

二是使用java8的函数接口
public enum MethodEnum {
// 使用lamada表达式的形式 传入一个(参数)->{表达式 返回值} 的函数
Method1(1,(In)->{System.out.println("第1个方法,参数为"+In); return 1;}),
Method2(2,(In)->{System.out.println("第2个方法,参数为"+In); return 1;});
public Integer getCode() {
return code;
}
public Function getFunction() {
return function;
}
private Integer code;
//定义Function为类变量
private Function function;
//Function<返回值类型, 参数类型>
MethodEnum(Integer code, Function<Integer, Integer> function) {
this.code = code;
this.function=function;
}
}
执行
public static void main(String[] args) {
MethodEnum.Method1.getFunction().apply(1);
MethodEnum.Method2.getFunction().apply(2);
}
结果

以上写法在某些特定的场景下可以简化if else ,正常情况下不太建议使用,因为还是让枚举去做枚举该做的事情吧,比如说保存常量。
原理:
那么为什么可以定义方法?
枚举里面的每一个值,实际上都是该枚举的一个实例对象,
枚举的构造方法是使用创建该枚举的枚举值的。
在枚举里面定义抽象方法,在定义枚举值的时候实现它。
或者在枚举的构造参数里面传入function对象,在java8的lamda表达式中这个代表一个函数
本文探讨了如何在枚举中定义方法来替代if-else结构,介绍了两种实现方式:使用抽象方法和Java 8的函数接口,并分析了这种方法的适用场景。同时,文章提醒虽然这种方式在某些特定情况下有用,但通常不推荐,因为枚举的主要作用是保存常量。枚举能定义方法的原因在于每个枚举值都是枚举类的实例,可以通过构造方法实现方法或利用Java 8的Lambda表达式传入函数对象。
7万+

被折叠的 条评论
为什么被折叠?



