-1
public class Operations {

    private int add;
    private int sub;
    private int mul;
    private int div;
    private double sqrt;

    public void setadd(int a, int b) {
        add = a + b;
    }

    public void setsub(int a, int b) {
        sub = a - b;
    }

    public void setmul(int a, int b) {
        mul = a * b;
    }

    public void setdiv(int a, int b) {
        div = a / b;
    }

    public void setsqrt(double sqt) {
        sqrt = Math.sqrt(sqt);
    }

    public int getadd() {
        return add;
    }

    public int getsub() {
        return sub;
    }

    public int getmul() {
        return mul;
    }

    public int getdiv() {
        return div;
    }

    public double getsqrt() {
        return sqrt;
    }

}

我是否必须为此或在 Java 中做一个不必要的原型,以及如何在这里使用静态方法而不是 setter 和 getter.. 我正在尝试做一个计算器.. 我的方法可以吗?

4

5 回答 5

2

我真的不明白设置和获取的意义,为什么不让你的计算器像这样:

public class Calculator {
public int add(int a, int b){
    return a + b;
}
public int sub(int a , int b){
    return a - b;
}
public int mul(int a, int b){
    return a * b;
}
public int div(int a, int b){
    return a/b;
}
public double sqrt(double sqt){
    return Math.sqrt(sqt);
}
于 2012-08-03T21:11:02.113 回答
2

使 Calculator 类的所有操作(加法、乘法、除法等)静态方法:

   class Calculator{

     public static int add(int a, int b){
           return a+b;
     }
     ...
于 2012-08-03T21:11:22.557 回答
1

您的方法都是错误的,因为您对操作的建模不正确。它不应该包含它的结果,它应该只做一个操作,而不是全部。操作对象应该是不可变的,并且它应该对给定两个操作数的特定操作产生答案。您也应该将二元运算与一元运算分开。

interface BinaryOp {
    double calculate(double left, double right);
}
interface UnaryOp {
    double calculate(double operand);
}
private static final BinaryOp ADD = new BinaryOp() {
    double calculate(double left, double right) {
        return left + right;
    }
};
private static final BinaryOp SUB = new BinaryOp() {
    double calculate(double left, double right) {
        return left - right;
    }
};
private static final BinaryOp MUL = new BinaryOp() {
    double calculate(double left, double right) {
        return left * right;
    }
};
private static final BinaryOp DIV = new BinaryOp() {
    double calculate(double left, double right) {
        return left / right;
    }
};
private static final UnaryOp SQRT = new UnaryOp() {
    double calculate(double operand) {
        return Math.sqrt(operand);
    }
};

现在您可以按名称组织您的运算符:

private static final Map<String,BinaryOp> opByName = new HashMap<String,BinaryOp>();
static {
    opByName.put("+", ADD);
    opByName.put("-", SUB);
    opByName.put("*", MUL);
    opByName.put("/", DIV);
}

使用此地图,您可以使用您的操作为您执行计算:

String op = "+";
double left = 123;
double right = 456;
double res = opByName.get(op).calculate(left, right);
于 2012-08-03T21:12:05.253 回答
0

只是为了回答尚未回答的问题部分:

你不需要java中的原型。

于 2012-08-03T21:11:54.380 回答
0

这看起来对一两个枚举很有用:

enum BinOp {
    ADD {
        @Override
        public int eval(int leftArg, int rightArg) {
            return leftArg + rightArg;
        }
        @Override
        public String symbol() {
            return "+";
        }
    },
    SUBTRACT {
        @Override
        public int eval(int leftArg, int rightArg) {
            return leftArg - rightArg;
        }
        @Override
        public String symbol() {
            return "-";
        }
    }
    // etc.
    ;
    public abstract int eval(int leftArg, int rightArg);
    public abstract String symbol();
}

还有一个类似的一元运算符枚举(目前只有SQRT)。

您可以按如下方式使用它们:

int left = 3;
int right = 2;
for (BinOp op : BinOp.values()) {
    System.out.println("The value of "
        + left + " " + op.symbol() + " " + right " is "
        + op.eval(left, right)
    );
}
于 2012-08-03T21:19:09.223 回答