java - 在不知道变量类型的情况下计算变量的算术表达式

标签 java

我有一个使用 (*/+ -) 运算符的算术表达式。变量分为三种类型 - 整数、浮点或 double 。通过在命令行中写入单词“double”、“float”或“integer”来选择变量的类型。我已经编写了该程序,但我不喜欢我的代码...

import java.io.BufferedReader;
import java.io.InputStreamReader;

class Work {

    InitializeForType init;
    String calculate_for;
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

    void  go() {
        try {
            calculate_for = bufferedReader.readLine();
            if (calculate_for.equals("double")){init = new InitializeForType<Double>();init.setA(1.23);}
            if (calculate_for.equals("float")){init = new InitializeForType<Float>();init.setA(1.23f);}
            if (calculate_for.equals("integer")){init = new InitializeForType<Integer>();init.setA(1);}
        } catch (java.io.IOException io) {
            System.out.println("ERROR!");
        }
        System.out.println(calculate(init.A));
    }


    private String calculate(Object a) {

        boolean is_double = a instanceof Double;
        boolean is_float = a instanceof Float;

        return "(arctg(2*c)/d + 2)/(d + a - 1) " +  " = (arctg(" + 2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) + ")/" + a + " + 2)/(" + a + " + " + a + " - 1)" + " = (" + Math.atan(2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a)))) + "/" + a + " + 2)/(" + a + " + " + a + " - 1)" + " = (" + (Math.atan(2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a)))) /
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) + 2) + ")/(" + (
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) +
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) - 1.0) + ")" + " = " + (Math.atan(2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a)))) /
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) + 2) / (
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) +
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) - 1.0);
    }

    private Double toDouble(Object ob) {
        return Double.parseDouble(ob.toString());
    }

    private Float toFloat(Object ob) {
        return Float.parseFloat(ob.toString());
    }

    private Integer toInt(Object ob) {
        return Integer.parseInt(ob.toString());
    }

    private static class InitializeForType<someType> {
        someType A;
        void setA(someType a) {
            this.A = a;
        }
    }
}

我不希望代码的算术部分重复三次。我写的是 (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a)))....我知道这很愚蠢,但它有效。

最佳答案

如果您希望代码更加 DRY,那么您需要面向对象的解决方案。 然后使用多态性来处理每种特殊情况。

您所做的是使用标志和过程编程。这并不可怕;它只是不易于阅读或灵活。如果您需要向该程序添加字符串值怎么办?好吧,现在您必须修改所有内容。

希望这能为您提供一些指导,而无需您重写整个程序。

关于java - 在不知道变量类型的情况下计算变量的算术表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42702465/

相关文章:

Java 类型转换和继承

java - 为什么 JavaFX 应用程序和场景构建器显示乱码?

java从XML文件读取JDBC连接

java - 如何在 Java 中搜索 XML 文件,然后输出 XML 文件名?

Java运行bash命令,同时为其提供输入并获取输出

java - 如果字符串是数组,则在两个对中查找字符串组合的有效方法

java - 未初始化的对象与初始化为 NULL 的对象

java - 如何从java代码修改现有的docker-compose文件

java - 在我的应用程序中包含卡片图像的最佳方式是什么?

java - 是否存在 Bigdecimal 与 MathContext.DECIMAL32 无法提供正确结果的情况?