在开关内使用枚举

时间:2011-05-22 04:38:04

标签: java enums

我们可以在交换机中使用枚举吗?

public enum Color {
  RED,BLUE,YELLOW


}


 public class Use {
  Color c = Color.BLUE;

  public void test(){
      switch(c){
      case Color.BLUE:

      }
  }
}

我在这方面遇到了一些错误。

The enum constant Color.BLUE reference cannot be qualified in a case label  Use.java        line 7  Java Problem

5 个答案:

答案 0 :(得分:10)

case COLOR.BLUE:

    }

在上面的代码而不是COLOR.BLUE中只写蓝色


E.G。

import java.awt.Color;

class ColorEnum {

    enum Color{BLUE,RED,YELLOW};

    public static void main(String[] args) {
        Color c = Color.BLUE;
        switch(c) {
            case BLUE:
                System.out.println("Blue!");
                break;
            case RED:
                System.out.println("Red!");
                break;
            case YELLOW:
                System.out.println("Yellow!");
                break;
            default:
                System.out.println("Logic error!");
        }
    }
}

答案 1 :(得分:4)

像这样写:

public void test(){
  switch(c) {
  case BLUE:

  }
}

用作案例标签时,enum标签不得限定。 JLS 14.11的语法说明了这一点:

SwitchLabel:
    case ConstantExpression :
    case EnumConstantName :
    default :

EnumConstantName:
    Identifier

请注意,需要一个简单的标识符,而不是枚举名称限定的标识符。

(我不知道他们为什么设计这样的语法。可能是为了避免语法中的歧义。但不管怎样,就是它的方式。)

答案 2 :(得分:1)

为什么要使用开关?而只是让enum持有Color信息本身(封装它),从而完成所有肮脏的工作。这样做的好处是,如果您更改枚举,则不必通过使用它的所有代码,更改所有switch语句。例如:

import java.awt.Color;

public enum MyColor {
   RED("Red", Color.red), BLUE("Blue", Color.blue), 
   YELLOW("Yellow", Color.yellow);

   private String text;
   private Color color;
   private MyColor(String text,Color color) {
      this.text = text;
      this.color = color;
   }

   public String getText() {
      return text;
   }

   public Color getColor() {
      return color;
   }

   @Override
   public String toString() {
      return text;
   }
}

以及如何使用它的示例如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
class MyColorTest extends JPanel {
   private static final Dimension PREF_SIZE = new Dimension(400, 300);

   public MyColorTest() {
      for (final MyColor myColor : MyColor.values()) {
         add(new JButton(new AbstractAction(myColor.getText()) {
            @Override
            public void actionPerformed(ActionEvent arg0) {
               MyColorTest.this.setBackground(myColor.getColor());
            }
         }));

      }
   }

   @Override
   public Dimension getPreferredSize() {
      return PREF_SIZE;
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("MyColorTest");
      frame.getContentPane().add(new MyColorTest());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }

}

答案 3 :(得分:0)

是的,您可以在switch语句中使用枚举,但请确保在案例标签中不要使用FQCN(完全限定类名)。


以下内容摘自“enum constant reference cannot be qualified in a case label of switch statement

简而言之

当Java switch语句使用enum参数时;枚举值的限定名称不应用于案例标签,而应仅用于不合格的名称;然后switch语句会认为所有标签都指的是用作参数的枚举类型。

为什么只有不合格的值?

如果允许使用合格的参考文献标签;没有办法限制标签中使用的枚举类型与switch语句的参数类型相同。

public enum Status {
    REGISTERED,
    TERMINATED
}

public class TestStatus {
    public static String getMessage(Status status) {
        String message;
        switch (status) {
            // case Status.REGISTERED: // line 1
            case REGISTERED: // line 2
                message = "Welcome";
                break;
            default:
                message = "Good bye";
                break;
        }
    return message;
}

答案 4 :(得分:0)

enum MyEnum{
    A,B,C

    MyEnum(){
        switch(this){
            case A:
                 //....
                 break;
            case B:
                 //....
                 break;
            case C:
                 //....
                 break;
        }
    }
}