public Calculator(int num1,int num2)是构造函数,是用来实例化类的。
自己不写,java编译器会默认生成一个无参构造public Calculator()
new public Calculator().add(1,2) 也可以实现,参数在方法里初始化(局部变量)
new public Calculator(1,2).add() 全局变量,变量在实例化对象的时候就初始化,你add方法中可以不用传参也行
加减乘除四则运行,应该是行为操作。类的设计存在问题。
我们设计代码,一般情况下,会把类划分成两大类别:
初学者,一般都会将两者混在一起来设计类,使得代码特点不够清晰,思维容易产生模糊。
我的设计思路:
代码如下:
public class Main {
interface Calculater {
double calculate(double x, double y);
}
static class Add implements Calculater {
@Override
public double calculate(double x, double y) {
return x + y;
}
}
static class Sub implements Calculater {
@Override
public double calculate(double x, double y) {
return x - y;
}
}
static class Mul implements Calculater {
@Override
public double calculate(double x, double y) {
return x * y;
}
}
static class Div implements Calculater {
@Override
public double calculate(double x, double y) {
return x / y;
}
}
static class Tracer implements Calculater {
final Calculater calculater;
Tracer(Calculater calculater) {
this.calculater = calculater;
}
@Override
public double calculate(double x, double y) {
double result = calculater.calculate(x, y);
System.out.println( calculater.getClass().getSimpleName() + " ( " + x + ", " + y + " ) ==> " + result);
return result;
}
}
public static void main(String[] args) {
Calculater add = new Tracer(new Add());
add.calculate(2, 5);
Calculater div = new Tracer(new Div());
div.calculate(5, 2);
}
}
结果:
Add ( 2.0, 5.0 ) ==> 7.0
Div ( 5.0, 2.0 ) ==> 2.5
上述代码过于繁琐。
可以使用枚举来化简代码:
public class Main0 {
enum Calculator {
Add {
@Override
double calculate(double x, double y) {
return x + y;
}
},
Sub {
@Override
double calculate(double x, double y) {
return x - y;
}
},
Mul {
@Override
double calculate(double x, double y) {
return x * y;
}
},
Div {
@Override
double calculate(double x, double y) {
return x / y;
}
};
abstract double calculate(double x, double y);
}
private static double trace(Calculator calculator, double x, double y) {
double result = calculator.calculate(x, y);
System.out.println( calculator.name() + " ( " + x + ", " + y + " ) ==> " + result);
return result;
}
public static void main(String[] args) {
trace(Calculator.Add, 2, 5);
trace(Calculator.Div, 5, 2);
}
}