2012-03-13 4 views
5

Пусть имеется ENUMперечисления, как арифметическая операция

enum Operations { 
    ADD, 
    SUBTRACT, 
    MULTIPLY 
} 

Я хочу использовать это перечисление, чтобы сложить два числа (скажет 5 и 3) и получить выход в 8 или Я хочу использовать это перечисление вычесть два числа (скажем 9 и 3) и получить выход в 6

Вопрос:

  • это возможно?
  • если да, то какие изменения должны быть внесены в это перечисление?

ответ

17

enum s может иметь абстрактные методы, и каждый член может реализовать его по-разному.

enum Operations { 
    ADD { 
    public double apply(double a, double b) { return a + b; } 
    }, 
    SUBTRACT { 
    public double apply(double a, double b) { return a - b; } 
    }, 
    MULTIPLY { 
    public double apply(double a, double b) { return a * b; } 
    }, 
    ; 

    public abstract double apply(double a, double b); 
} 

позволит сделать

Operations op = ...; 
double result = op.apply(3, 5); 
+2

Очень хороший ответ, +1. – Perception

4

Вы можете использовать переключатель на значение перечисления:

switch (operator) { 
case ADD: 
    ret = a + b; 
    break; 
case SUBTRACT: 
    ret = a - b; 
    break; 
case MULTIPLY: 
    ret = a * b; 
    break; 
} 
1

Вы должны использовать перечисление в качестве флага для того, что операция для выполнения:

public int computeOperation(int leftOperand, Operation op, int rightOperand) { 
    switch(op) { 
     case ADD: 
      return leftOperand + rightOperand; 
     case SUBTRACT: 
      return leftOperand - rightOperand; 
     case MULTIPLY: 
      return leftOperand * rightOperand; 
    } 

    return null; 

Поскольку вы возвращения для каждого случая, вы не нужно беспокоиться о провале.

4

Как об использовании JAVA 8 функций:

enum Operation implements DoubleBinaryOperator { 
    PLUS ("+", (l, r) -> l + r), 
    MINUS ("-", (l, r) -> l - r), 
    MULTIPLY("*", (l, r) -> l * r), 
    DIVIDE ("/", (l, r) -> l/r); 

    private final String symbol; 
    private final DoubleBinaryOperator binaryOperator; 

    private Operation(final String symbol, final DoubleBinaryOperator binaryOperator) { 
     this.symbol = symbol; 
     this.binaryOperator = binaryOperator; 
    } 

    public String getSymbol() { 
     return symbol; 
    } 

    @Override 
    public double applyAsDouble(final double left, final double right) { 
     return binaryOperator.applyAsDouble(left, right); 
    } 
}