Java枚举多个键映射到单个方法

问题描述

我正在查看来自 here 的这段代码:

enum Operator {
    ADD {
        @Override int execute(final int num1,final int num2) {
            return num1 + num2;
        }
    },SUBTRACT {
        @Override int execute(final int num1,final int num2) {
            return num1 - num2;
        }
    },MULTIPLY {
        @Override int execute(final int num1,final int num2) {
            return num1 * num2;
        }
    },DIVIDE {
        @Override int execute(final int num1,final int num2) {
            if (num2 != 0) {
                return num1 / num2;
            } else {
                System.out.println("Can't divide by zero.");
            }
            return 0;
        }
    };

    abstract int execute(int num1,int num2);
}

public class EnumWithoutDefinedFunctions {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 2;
        Operator operator = Operator.DIVIDE;
        int result = operator.execute(num1,num2);
        System.out.println("result: " + result);
    }
}

我正在寻找一种使用不同键调用相同方法的方法。例如,ADDADD2 都应该执行相同的实现

ADD,ADD2 {
    @Override int execute(final int num1,final int num2) {
        return num1 + num2;
    }
},

但是,对代码的上述更改导致以下错误:

enter image description here

解决方法

我找到了一种解决方法,不确定这是否是优化的解决方案,即创建一个方法,然后为需要相同实现的键调用相同的方法:

public class EnumTest {
    enum Operator {
        ADD {
            @Override int execute(final int num1,final int num2) {
                return addImpl( num1,num2);
            }
        },ADD2 {
            @Override int execute(final int num1,SUBTRACT {
            @Override int execute(final int num1,final int num2) {
                return num1 - num2;
            }
        },MULTIPLY {
            @Override int execute(final int num1,final int num2) {
                return num1 * num2;
            }
        },DIVIDE {
            @Override int execute(final int num1,final int num2) {
                if (num2 != 0) {
                    return num1 / num2;
                } else {
                    System.out.println("Can't divide by zero.");
                }
                return 0;
            }
        };

        private static int addImpl(int num1,int num2){
            return num1 + num2;
        }

        abstract int execute(int num1,int num2);
    }

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 2;
        Operator operator = Operator.ADD2;
        int result = operator.execute(num1,num2);
        System.out.println("result: " + result);
    }
}
,

IMO,您可以使用功能接口 BiFunction 改进设计。

代码如下:

public class EnumTest {

    enum Operator implements BiFunction<Integer,Integer,Integer> {
        ADD(Operator::addImpl),ADD2 (Operator::addImpl),SUBTRACT((num1,num2) -> num1 - num2),MULTIPLY((num1,num2) -> num1 * num2),DIVIDE (Operator::divide);

        public static Integer divide(Integer num1,Integer num2) {
            if (num2 != 0) {
                return num1 / num2;
            } else {
                System.out.println("Can't divide by zero.");
            }
            return 0;
        }

       final BiFunction<Integer,Integer> biFunction;

       Operator(BiFunction<Integer,Integer> apply){
           this.biFunction = apply;
       }

       public Integer apply(Integer a,Integer b){
           return biFunction.apply(a,b);
       }

        private static int addImpl(int num1,int num2){
            return num1 + num2;
        }
    }
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 2;
        Operator operator = Operator.ADD2;
        int result = operator.apply(num1,num2);
        System.out.println("result: " + result);
    }
}

并且可以利用 BiFunction 接口很好地组合多个操作,例如:

Function<Integer,Integer> multiplyBy2 = l -> 2 * l;
int result2 = Operator.ADD2.andThen(multiplyBy2).apply(num1,num2);
System.out.println(result2);

输出:

24

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...