2012-03-13 11 views
5

Supponiamo che ci sia un enumenum come un'operazione aritmetica

enum Operations { 
    ADD, 
    SUBTRACT, 
    MULTIPLY 
} 

voglio usare questo enum per aggiungere due numeri (diciamo 5 e 3) e ottenere l'uscita come 8 o voglio usare questo enum per sottrarre due numeri (diciamo 9 e 3) e ottenere l'output come 6

domanda:

  • è possibile?
  • se sì di quali sono le modifiche da fare a questo enum?

risposta

17

enum s possono avere metodi astratti, e ogni membro può implementare in modo diverso.

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); 
} 

vi permetterà di fare

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

risposta molto buona, +1. – Perception

4

È possibile utilizzare un interruttore sul valore di enumerazione:

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

si dovrebbe usare l'enum come una bandiera per la quale operazione da eseguire:

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; 

Dal momento che stai tornando per ogni caso, non devi preoccuparti di cadere.

4

ne dite di usare Java 8 caratteristiche:

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); 
    } 
}