gpt4 book ai didi

java - 是否可以使用字符串作为切换值来用 switch 语句替换 if-else ?

转载 作者:行者123 更新时间:2023-12-01 17:28:50 24 4
gpt4 key购买 nike

我想知道在这种情况下是否可以使用 switch 语句而不是 if-else 语句。变量取自 JComboBoxes 并由 ActionEvent 处理:

public void actionPerformed(ActionEvent event) {

Object source = event.getSource();

if (source == comboUnit) {

String unit = comboUnit.getSelectedItem().toString();

if (unit.equals("Unit 1")) {
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined1;
labelDesc.setText("Unit 1");
convert();
}

else if (unit.equals("Unit 2")) {
unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined2;
labelDesc.setText("Unit 2");
convert();
}
(...)

我试图将纯字符串作为值传递,但没有成功。您对如何完成(以及如果可能的话)有任何提示吗?

最佳答案

Java 7 允许您在 String切换

您的代码需要重构,以及是否使用 switch 还是 enumerations 的问题或maps我想说的是,这是第二位的。

你有太多重复的代码在做本质上相同的事情。我指的是:

unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * defined1;
labelDesc.setText("Unit 1");
convert();

显然,因为您根据所使用的单位使用不同的因子进行乘法,所以您需要一个评估要使用的因子的单位函数。用较少的数学术语来说,您需要根据提供的字符串产生 define1define2 值的东西。您已经拥有引用相关单位“名称”的 unit,您可以使用它。我调用返回 factor 因子的方法,接收单位名称并返回 Number (因为无论您是乘以整数还是实数,它都不能从您的示例中得出)某种形式)。我还假设您的 define1define2 等是变量或文字。

unitValue = Double.parseDouble(tfUnit.getText());
valMeter = unitValue * factor(unit);
labelDesc.setText(unit);
convert();

Number factor(String unitName) {
switch(unitName) {
case "Unit 1": return defined1;
case "Unit 2": return defined2;
default: throw new Exception("Unknown unit");
}
}

该方法本身就是您“切换或不切换”问题出现的地方。您可以随意使用 map如果你愿意:

Map<String, Number> unitNameValueMap = new HashMap<String, Number>();

unitNameValueMap.put("Unit 1", defined1);
unitNameValueMap.put("Unit 2", defined2);

Number factor(String unitName) {
Number result = unitNameValueMap.get(unitName);
if(result == null) throw new Exception("Unknown unit");
return result;
}

或者您可以使用枚举:

enum UnitValue {
UNIT1(defined1), UNIT2(defined2);
final Number value;
private UnitValue(Number value) {
this.value = value;
}
}

Number factor(String unitName) {
return Enum.valueOf(UnitValue.class, "UNIT" + Integer.parseInt(unitName.substring(5)).value;
}

您甚至可以切换或在枚举中使用映射,这也将为您提供良好的代码可读性。

您需要分析您的程序,看看您是否需要基于 switch 的解决方案、基于枚举的解决方案或基于映射的解决方案。从目前的情况来看,正如您亲眼所见,由于单元名称、枚举常量及其值之间的关系,基于enum的解决方案有点困惑。如果有人可以用枚举做得更好,那么自然就采用他们的代码。

通常,最短的代码是最好的,因为它更容易阅读并且最容易理解。但要小心 map - 它们比其他解决方案会产生更多的开销,因此我更喜欢在 map 较少且每个键有多个键的情况下使用它们,而不是相反。

关于java - 是否可以使用字符串作为切换值来用 switch 语句替换 if-else ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12940969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com