Java 在交换机中使用enum

Java 在交换机中使用enum,java,enums,Java,Enums,我们可以在交换机中使用enum吗 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 qualifi

我们可以在交换机中使用enum吗

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
在上面的代码中,不要用COLOR.BLUE,只写BLUE


例如

这样写:

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

  }
}
enum
标签用作案例标签时不得限定。语法是这样说的:

SwitchLabel:
    case ConstantExpression :
    case EnumConstantName :
    default :

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


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

为什么要使用开关?而是让enum保存颜色信息本身(封装它),从而完成所有脏活。这样做的好处是,如果更改枚举,则不必在使用它的所有代码中进行根操作,也不必更改所有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();
         }
      });
   }

}

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


以下内容摘自“”

简言之

当Java switch语句使用枚举参数时;不应在大小写标签中使用枚举值的限定名称,而应仅在非限定名称中使用;然后Switter语句将考虑所有的标签都引用作为参数的EnUM类型。p> 为什么只有非限定值?

箱子标签是否允许有合格的参考资料;没有办法限制标签中使用的枚举类型与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;
}

您能发布您试图编译的实际代码吗(剪切并粘贴)?@all:粘贴了实际代码,您现在可以建议吗?顺便说一句,您可能不想为枚举指定与java.awt.Color类相同的名称,因为这可能会使代码混淆。我想在名称中使用“Color”,但会添加后缀或前缀。@ako:请参见编辑@安基特:我觉得最好在你的答案上贴上我的小帖子(因为它是基于你的答案)-希望你不介意。你在说什么?原始问题有一个名为
Color
的自定义枚举,与
awt.Color
或从一个枚举转换到另一个枚举无关。@Veredesmarld:原始问题是关于使用枚举来封装颜色的概念,而切换是OP如何尝试使用枚举来生成相应的java.awt.Color(如果你查看他的帖子,你会看到这个)。有时最好的答案不是OP直接寻找的答案,我认为这是其中之一,但我接受你的不同意见和你的反对票。@Veredesmarld:我想在这里传达的想法是将相关信息封装在一个类或枚举中,从而使代码不易出现错误,更易于使用调试。另一种方法是将switch语句作为静态方法,它是枚举的一部分,但是为什么每个枚举成员都可以更简单地保存信息呢?@Hovercraft:我只是查看了原始问题,但仍然没有看到与
awt
相关的任何内容。我假设所提到的颜色枚举只是pu的一个人为示例询问“如何切换枚举”的目的。在很多情况下,切换枚举是有用且正确的,我认为,在从上面的小片段中假设他想要做什么之后,再猜测OP并提供一大堆不相关的信息是没有建设性的。@Veredesmarld:你的论点有价值的(评论为1+),我接受并同意——我的回答不适用于如何将开关与枚举一起使用的一般问题。但在OP澄清之前,我将推迟删除我的回答。如果他的陈述证实了您的担忧,那么我将很乐意删除此回答。
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();
         }
      });
   }

}
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;
}
enum MyEnum{
    A,B,C

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