【问题标题】:Using a variable in a Java case statment在 Java 案例语句中使用变量
【发布时间】:2021-05-03 01:00:55
【问题描述】:

我正在为计算器制作表达式解析器。表达式将包含一个变量,例如,用户可以输入“x + 2”或“y^2”。我有一个switch语句,switch语句中的一种情况在检测到变量时会执行某个动作:

case variableSymbol:
                    if (expression.length() == 1) 
                    {
                        rangeResult = x1;
                        break outer;
                    }
                    varFlag = true;
                    varPos = expresPos;
                    break;

最初,我在上述情况下硬编码了一个值“x”,但我想让用户选择他们使用哪个变量,所以在解析函数中添加了一个 char 参数,并将其命名为 variableSymbol。 这是函数的参数:

public static ArrayList<Double> parseRange(String expression, char variableSymbol, double x1, double x2, double step)

但是 Java 不允许变量作为 switch 语句中的 case。有没有办法解决?避免重写 switch 语句的解决方案是最好的,因为它有数百行长。感谢您的帮助。

【问题讨论】:

  • 首先,几 行 switch-case 需要立即重构(只是为了这么长)。其次,如果值在编译时未知,您可以改用if-else。但同样,您的if-else 也会增长到数百行代码。所以,最好修复您的设计。
  • 你的switch语句有几百行?!?!?我肯定会重新考虑您的设计,并提出更好的解决方案。
  • 创建一些运算符类和一个你传递给运算符的工厂怎么样?这样,它将是包含 case 语句内部逻辑的运算符类。这将简化代码的可读性和维护成本。
  • 我将研究代码重构,但大多数语句都是必要的。该计算器用于评估积分和导数,因此用户需要能够输入所有三角函数,以及指数泛函、自然对数和以 10 为底的对数,并且还必须能够对这些函数进行基本的算术运算函数,所以我认为我不能让它更短

标签: java switch-statement compile-time-constant


【解决方案1】:

不,这是不可能的,对于switch 的情况没有意义;你想要的可以用if-else来实现。原因是因为 switch 通常使用查找表来实现,比if-else 更有效;但为了实现这一点,需要在编译时设置分支。

【讨论】:

  • 感谢您的帮助。在其中一种情况下使用 if 语句是否明智? variableSymbol 案例之前的案例都落到了谷底,所以应该可以说 if( expresChar == variableSymbol ){ foo; }。但这是否太过分了
  • 我可能会使用模式匹配(参见 Scanner 类);或者如果语言应该更复杂,可以使用 ANTLR 或 JavaCC 等解析器生成器。 if-else 或 switch 仅适用于琐碎的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多