перечисление как арифметическая операция - PullRequest
5 голосов
/ 13 марта 2012

Предположим, есть ENUM

enum Operations { 
  ADD, 
  SUBTRACT, 
  MULTIPLY
}

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

Вопрос:

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

Ответы [ 4 ]

20 голосов
/ 13 марта 2012

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);
5 голосов
/ 08 марта 2015

Как насчет использования функций 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);
    }
}
4 голосов
/ 13 марта 2012

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

switch (operator) {
case ADD:
    ret = a + b;
    break;
case SUBTRACT:
    ret = a - b;
    break;
case MULTIPLY:
    ret = a * b;
    break;
}
1 голос
/ 13 марта 2012

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

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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...