关于Java:switch-case 与 if-else哪种更好

Better: switch-case or if-else?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
If/Else vs. Switch

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

开关盒:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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!");
        }

    }
}

如果其他:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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!");
    }
}


我也不想这样做:

1
2
3
4
5
6
7
8
9
10
11
12
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!");
}


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

  • 如果您以相同的方式处理所有异常,那么在相同的地方进行处理。

  • 尽可能严密地限定变量的范围。

  • 提示输入实际需要的值,ffs。:)

import java.io.*;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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!");
        }
    }
}


你喜欢哪一个?这是你的密码。

我当然更喜欢开关盒,但是如果你有一些组合的东西,比如"大于"开关盒不是正确的方法。

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

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

安德烈亚斯


1
2
3
4
5
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!"
);

我不清楚这个问题是关于特定代码示例的解决方案,还是关于总体结构。所以,如果其他方法的一些优点需要考虑。

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

  • 如果你发现需求不断变化,您需要支持不同的数据类型。我不得不把枚举上的很多开关改成字符串比较我的时间,当有人添加了一个要求,用户能够配置选项。

  • 需要使用断路器;正确的内部开关引入偶尔会出现一些奇怪的错误,这些错误只会出现在角落的案例中,开关变大变复杂。

当然,作为一个企业程序员,我会创建一个TimeUnitSubvisionResolvingVisitor…:)


如何:

1
2
3
4
(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");

;)

你也可以这样做:

1
2
3
4
5
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);

我想两者都应该有效。


实现它的另一种方法是通过一个映射。它将使其具有可配置性,特别是当您使用Spring时,如果您决定在bean.xml中设置这个映射变量。

不管怎样,这里有另一种选择:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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));