0

我想知道在这种情况下是否可以使用 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();
        }
(...)

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

4

4 回答 4

3

Java 7 允许您switchStrings.

但是他们说如果有人饿了,最好教他们如何钓鱼,而不是给他们一条鱼。从长远来看。我的意思是你的代码需要重构,是使用枚举还是映射switch第二个问题。

你有太多重复的代码在做同样的事情。我指的是:

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

显然,因为您根据使用的单位使用不同的因子进行乘法运算,所以您需要一个对要使用的因子进行单位评估的函数。用较少的数学术语来说,您需要一些能够产生defined1或者defined2取决于提供的字符串的值的东西。您已经有了相关unit单位的“名称”,您可以使用它。我调用返回因子的方法factor,接受单位名称并返回a Number(因为无论您是乘以整数还是某种实数,它都没有遵循您的示例)。我还假设您的defined1defined2是变量或文字。

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<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或在枚举中使用映射,这也将为您提供良好的代码可读性。

您需要分析您的程序以查看您是否需要switch基于 - 的解决方案或基于枚举的解决方案或基于地图的解决方案。它当前的方式以及您自己可以看到的方式,enum基于 - 的解决方案有点混乱,因为您的单位名称、枚举常量和它们的值之间的关系。如果有人可以用枚举做得更好,那么自然而然地取而代之的是他们的代码。

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

于 2012-10-17T18:35:03.240 回答
1

您可以使用Enum枚举值替换字符串

public static void main(String[] args) {
    Units unit = Units.Unit1;
    switch (unit) {
    case Unit1:
        break;
    case Unit2:
        break;
    }
}

enum Units {
    Unit1, Unit2,
}

Java 7 允许您在 switch 语句中使用字符串

于 2012-10-17T18:34:59.897 回答
1

你的意思是喜欢

switch (unit) {
case "Unit 1":
  // do something
  break;

case "Unit 2":

}

?

是的,你可以,从 Java7 开始。

但就您而言,您似乎既不需要 switch 也不需要 if/else。在这两种情况下你都做同样的事情:

 String unit = comboUnit.getSelectedItem().toString();
 unitValue = Double.parseDouble(tfUnit.getText());
 valMeter = unitValue * defined1;
 labelDesc.setText(unit);
 convert();
于 2012-10-17T18:35:19.280 回答
0

只有在 Java 7 及更高版本中才能在 switch-case 语句中使用字符串。这是文档的链接,您需要向下滚动到字符串部分。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

于 2012-10-17T18:36:52.820 回答