java中类和对象应用问题

img


想要创建个类,实现两个数的加减乘除,但

img


为什么要创public Calculator(int num1,int num2)这个类?感觉不用这个也可以照常加减乘除

public Calculator(int num1,int num2)是构造函数,是用来实例化类的。
自己不写,java编译器会默认生成一个无参构造public Calculator()
new public Calculator().add(1,2) 也可以实现,参数在方法里初始化(局部变量)
new public Calculator(1,2).add() 全局变量,变量在实例化对象的时候就初始化,你add方法中可以不用传参也行

加减乘除四则运行,应该是行为操作。类的设计存在问题。

我们设计代码,一般情况下,会把类划分成两大类别:

  1. 存储数据的类(JavaBean)
  2. 操作数据的类(Action)

初学者,一般都会将两者混在一起来设计类,使得代码特点不够清晰,思维容易产生模糊。

我的设计思路:

  1. 抽象出四则运算的接口类,完成计算功能;
  2. 创建加减乘除四个计算的实现类,实现计算功能;
  3. 创建Tracer装饰器类,完成计算结果的控制台输出。

代码如下:


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