首先看一段程序。

int type=2;  
switch (type){  
    case 1:  
        System.out.print(1);  
    case 2:  
        System.out.print(2);  
    case 3:  
        System.out.print(3);  
}

踩过这个坑或者仔细看过 switch 语法的人都知道,上面的程序会打印出:23 ,而不是 2。因为 switch 语句会从相匹配的 case 开始执行,直到遇到 break 语句,或者执行整一个 switch 语句。如果没加 break ,则会将 2 和 3 的 case 都执行,而不是只执行匹配的 case ,所以在使用 switch 时,一定要注意加 break ,或者在 case 里 return,否则很容易出现程序错误。

在编程时,我们可以通过一些插件来提醒我们这些的错误的发生,例如 SonarLint 、Alibaba Java Coding Guidelines。

有时候,我们也可以通过多态避免 switch 的使用,例如:

//定义一个接口
public interface Person {  
    void doSomeThing();  
}

// 实现类
public class Student implements Person{  
    @Override  
    public void doSomeThing() {  
        System.out.println("Student");  
    }  
}

public class Teacher implements Person{  
    @Override  
    public void doSomeThing() {  
        System.out.println("Teacher");  
    }  
}

// 辅助类
public class PersonManager {  
    final static Map<Integer,Person> personMap=new ConcurrentHashMap<>();  
    static {  
        personMap.put(1,new Student());  
        personMap.put(2,new Teacher());  
    }  
  
    public static Person getPerson(int i){  
        return personMap.get(i);  
    }  
}

//使用
public static void main(String[] args) {  
    Person p=PersonManager.getPerson(2);  
    p.doSomeThing();  
}