我们可以在交换机中使用枚举吗?
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
答案 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;
}
}
}