繁体   English   中英

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

[英]Is it possible to replace if-else with switch statement using strings as switching values?

我想知道在这种情况下是否可以使用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允许您switch String

但是他们说如果有人饿了,最好教他们怎么钓鱼,而不是给他们一条鱼。 从长远来看。 我要说的是您的代码需要重构,其次才是使用switch枚举映射

您实际上有太多重复的代码要做相同的事情。 我指的是:

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

显然,由于根据使用的单位使用不同的因子相乘,因此需要具有对要使用的因子进行评估的单位功能。 在少数学术语,你需要的东西,要么产生的价值defined1defined2根据提供的字符串。 您已经具有引用所涉及unit的“名称”的单元,可以使用它。 我将方法返回为factor的factor ,接受一个单位名称并返回一个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的解决方案有点混乱。 如果有人可以用枚举做得更好,那么自然而然地采用他们的代码。

通常,最短的代码是最好的,因为它更易于阅读和理解。 但是请谨慎使用地图-它们比其他解决方案产生更多的开销,因此我更喜欢在地图较少且每个地图具有多个键的情况下使用它们,而不是相反。

您可以使用Enum并将字符串替换为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语句中使用字符串

你的意思是像

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

case "Unit 2":

}

是的,可以,从Java7开始。

但就您而言,您似乎既不需要切换,也不需要/其他。 在两种情况下,您都做相同的事情:

 String unit = comboUnit.getSelectedItem().toString();
 unitValue = Double.parseDouble(tfUnit.getText());
 valMeter = unitValue * defined1;
 labelDesc.setText(unit);
 convert();

仅在Java 7和更高版本中,才可以在switch-case语句中使用Strings。 这是文档的链接,您需要向下滚动到String部分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM