【问题标题】:Java Enum Multiple Keys mapped to single methodJava枚举多个键映射到单个方法
【发布时间】:2021-02-13 00:51:32
【问题描述】:

我正在查看来自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;
    }
},

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

【问题讨论】:

    标签: java java-8 enums simplify


    【解决方案1】:

    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, Integer> biFunction;
    
           Operator(BiFunction<Integer, 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
    

    【讨论】:

      【解决方案2】:

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

      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, final int num2) {
                      return addImpl( 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;
                  }
              };
      
              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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2021-10-24
        相关资源
        最近更新 更多