数学表达式为枚举类型JAVA

时间:2015-10-03 21:04:51

标签: java

我只想知道我是否定义了

public enum Op {-,+}

我可以选择其中一个并且像4 +Op[0] +3这样的数学会返回1而不是4-3,但它也要求标识符

2 个答案:

答案 0 :(得分:5)

enumclass ( type)中的一种特殊java,它可以包含称为常量的实例字段以及方法。 定义常量名称的方式会违反规则以在java中定义字段。 一个字段必须满足某些字符,包括a-z,A-Z,_(在得分下)。 因此,算术符号不允许作为常量名称。

其次,当你在这里调用4+Op[0]+3时,你正在用加号(符号)连接操作数并期望一个整数值!它不是你在Java中可以期待的方式。它看起来像运算符重载..但Java不支持运算符重载。

在以下示例中,您可以根据需要重载Calculator.execute()。 例如,要获得浮点结果,您可以执行以下操作:

public float execute(float a , Op op, float b ){
 float f=0.0f; 
// TODO
 return f;}...

以下是您希望在java中实现的解决方案之一:

public class EnumTest
{

    public static void main (String []args)
    {
        Calculator c=new Calculator();
        int a=c.execute(4,  Op.PLUS,3);
        System.out.println("4 +Op.PLUS +3="+a);
        a=c.execute(4, Op.MINUS, 3);

        System.out.println("4 +Op.MINUS+3="+a);

     // prints 
     // 4 +Op.PLUS +3=7
     //  4 +Op.MINUS +3=1 

    }

}
enum  Op{MINUS, PLUS,MULTIPLY,DIVIDE};

class Calculator
{
public int execute (int operandA, Op op, int operandB)
{
int a=0;
switch(op)
{
case MINUS:
    a=operandA-operandB;
    break;
case PLUS:
    a=operandA+operandB;
    break;
case MULTIPLY: 
    a=operandA*operandB;
    break;
case DIVIDE:
    if(operandB>0) // avoid devideByZero exception 
    a=operandA/operandB;
        break;
}
return a;
}
}

答案 1 :(得分:1)

这是我能提出的最接近的:

 enum Op implements IntBinaryOperator {
    minus((i,j) -> i-j),plus((i,j) -> i+j);

    @Override
    public int applyAsInt(int left, int right) {
        return op.applyAsInt(left, right);
    }
    final IntBinaryOperator op;
    Op(IntBinaryOperator op) {
        this.op = op;
    }
}

像这样使用:

IntBinaryOperator op = Op.minus;
int one = op.applyAsInt(4,3);