更好:切换案例或if-else?

时间:2011-07-28 01:00:21

标签: java switch-statement if-statement

  

可能重复:
  If/Else vs. Switch

我这里有两个代码,我只想问两个中哪一个在可写性(编写代码的简易性)和可读性(易于理解代码)方面更好。

的switch-case:

import java.io.*;

public class Quarter{
    public static void main(String[] args){
        int day;
        String input="";

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("Input a number from 1 to 3: ");

        try{
            input=in.readLine();
        }catch(IOException e){
            System.out.println("Error!");
        }
        day=Integer.parseInt(input);

        switch(day){
            case 1:
            case 2:
            case 3:
                System.out.println("1st Quarter");
                break;
            case 4:
            case 5:
            case 6:
                System.out.println("2nd Quarter");
                break;
            case 7:
            case 8:
            case 9:
            System.out.println("3rd Quarter");
            break;
            case 10:
            case 11:
            case 12:
                System.out.println("4th Quarter");
                break;
            default: System.out.println("Error!");
        }

    }
}

如果 - 否则:

import java.io.*;

public class Days{
    public static void main(String[] args){
        int day;
        String input="";

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("Input a number from 1 to 12: ");

        try{
            input=in.readLine();
        }catch(IOException e){
            System.out.println("Error!");
        }
        day=Integer.parseInt(input);

        if(day>=1 && day<=3){
            System.out.println("1st Quarter");
        }else
        if(day>=4 && day<=6){
            System.out.println("2nd Quarter");
        }else
        if(day>=7 && day<=9){
            System.out.println("3rd Quarter");
        }else
        if(day>=10 && day<=12){
            System.out.println("4th Quarter");
        }else
            System.out.println("Error!");
    }
}

7 个答案:

答案 0 :(得分:36)

我也不会这样做:

String[] out = {
    "1st Quarter",
    "2nd Quarter",
    "3rd Quarter",
    "4th Quarter"
};

if (1 <= day && day <= 12) {
    System.out.println(out[(day - 1) / 3]);
} else {
    System.out.println("Error!");
}

答案 1 :(得分:3)

您更喜欢哪一个?这是你的代码。

我绝对更喜欢开关盒,但是如果你有一些组合或者例如'大于'切换案例不是正确的做法。

另一件事:我会像下面这样写开关案例,因为我认为最好阅读:

switch(day){
    case 1:
    case 2:
    case 3:
        System.out.println("1st Quarter");
        break;
...        
}

HTH,Andreas

答案 2 :(得分:3)

  • 首先避免逻辑分支。表查找通常是一种有用的技术。算术操作也很重要 - 在你关心的值中寻找一个模式,以及一个将它们转换成更简单的函数的函数。在更复杂的情况下也要考虑多态性。

  • 如果您以相同的方式处理所有例外情况,请在同一地点进行处理。

  • 范围变量尽可能紧密。

  • 提示你真正想要的输入,FFS。 :)

import java.io.*;

public class Quarter {
    public static void main(String[] args) {
        try {
            System.out.print("Input the month number (1 = January, 2 = February ... 12 = December): ");
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            int month = Integer.parseInt(in.readLine());
            int quarter = (month - 1) / 3;
            String[] quarters = new String[]{ "1st", "2nd", "3rd", "4th" };
            System.out.println(quarters[quarter] + " Quarter");
        } catch (Exception e) { // IOException for non-numeric, or AIOOBE for out of range
            System.out.println("Error!");
        }
    }
}

答案 3 :(得分:2)

怎么样:

(day>=1 && day <=3) ? System.out.println("1st Quarter") :
  (day >= 4 && day <= 6) ? System.out.println("2nd Quarter") :
    (day >=7 && day <= 9) ? System.out.println("3rd Quarter") :
      (day >= 10 && day <= 12) ? System.out.println("4th Quarter") : System.out.println("Error1");

你也可以这样做:

String val = (day>=1 && day <=3) ? "1st Quarter" :
      (day >= 4 && day <= 6) ? "2nd Quarter" :
        (day >=7 && day <= 9) ? "3rd Quarter" :
          (day >= 10 && day <= 12) ? "4th Quarter" : "Error1";
System.out.println(val);

我认为要么应该有用。

答案 4 :(得分:2)

我不清楚问题是关于特定代码示例的解决方案,还是关于一般结构的问题。因此,if-else方法的一些优点需要考虑。

  • if-else在代码总体上更常见,因为数量 交换机接受的数据类型是有限的,交换机本身是有限的 编译时间值。更熟悉的可读性更好 更广泛的受众。

  • 如果找到你的基本结构不会改变 需求发生变化,您需要支持不同的数据类型。 我不得不将枚举上的大量开关改为字符串比较 我有人添加了用户能够要求的时间 配置选项。

  • 需要休息;正确的内部开关介绍 奇怪的错误的机会只出现在角落的情况下 交换机变得庞大而复杂。

当然我个人是企业程序员,我会创建一个timeUnitSubDivisionResolvingVisitor ... :)

答案 5 :(得分:2)

String[] suffix = new String[]{ "st", "nd", "rd", "th" };
System.out.println((1 <= day && day <= 12)?
    String.format("%d%s Quarter", (day-1)/3+1, suffix[(day-1)/3]):
    "Error!"
);

答案 6 :(得分:1)

实现它的另一种方法是通过Map。它会使它可配置,尤其是你正在使用Spring,你可以在bean.xml中设置这个Map变量,如果你决定的话。

无论如何这里是替代方案:

Map<Integer, String> m = new HashMap<Integer, String>();
m.put(1, "1st Quarter");
m.put(2, "1st Quarter");
m.put(3, "1st Quarter");
m.put(4, "2nd Quarter");
m.put(5, "2nd Quarter");
m.put(6, "2nd Quarter");
m.put(7, "3rd Quarter");
m.put(8, "3rd Quarter");
m.put(9, "3rd Quarter");
m.put(10, "4th Quarter");
m.put(11, "4th Quarter");
m.put(12, "4th Quarter");

System.out.println(m.get(d));