2013-03-19 30 views
0

当我通过一个简单的Enum测试器遍历for-each循环和switch语句来输出枚举值时,我看到的行为对我来说似乎很陌生。带枚举的开关情况导致重复

代码:

public class EnumTest { 

    private Number number; 

    public EnumTest(Number number) { 
     this.number = number; 
    } 
    public enum Number { 
     ONE, 
     TWO, 
     THREE, 
     FOUR, 
     FIVE; 
    } 
    private void tellItLikeItIs() { 
     switch (number) { 
      case ONE: 
       System.out.println("ONE"); 
      case TWO: 
       System.out.println("TWO"); 
      case THREE: 
       System.out.println("THREE"); 
      case FOUR: 
       System.out.println("FOUR"); 
      case FIVE: 
       System.out.println("FIVE"); 
     } 
    } 
    public static void main(String[] args) {  
     for (Number n : Number.values()) { 
      EnumTest et = new EnumTest(n); 
      et.tellItLikeItIs(); 
      System.out.println(); 
     } 
    } 
} 

输出:

ONE 
    TWO 
    THREE 
    FOUR 
    FIVE 

    TWO 
    THREE 
    FOUR 
    FIVE 

    THREE 
    FOUR 
    FIVE 

    FOUR 
    FIVE 

    FIVE 

为什么每次调用返回自身和所有后续值?

+4

你忘了'break' – user1516873 2013-03-19 13:48:48

+0

我很惊讶你的编译器并没有警告你这件事。你用什么来编译? – 2013-03-19 13:50:14

+0

愚蠢的问题。我会在下面回答。有趣的是,我发布的那一分钟是我意识到答案的那一刻。 – 2013-03-19 13:50:41

回答

7

那是因为你忘了break;语句...

private void tellItLikeItIs() { 
     switch (number) { 
      case ONE: 
       System.out.println("ONE"); 
       break; 
      case TWO: 
       System.out.println("TWO"); 
       break; 
      case THREE: 
       System.out.println("THREE"); 
       break; 
      case FOUR: 
       System.out.println("FOUR"); 
       break; 
      case FIVE: 
       System.out.println("FIVE"); 
       break; 
     } 
    } 

了解更多关于switch语句here

如果没有他们,在开关块语句告吹:匹配之后的所有语句不管后续案例标签的表达如何,都会按顺序执行案例标签,直到遇到break语句为止

1

你为什么不只是使用Enum.name()或Enum.toString()方法,象下面这样:

private void tellItLikeItIs() { 
    System.out.println(number.name()); 
    } 

private void tellItLikeItIs() { 
    System.out.println(number); 
    }