Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对交换机使用枚举值_Java_Enums - Fatal编程技术网

Java 对交换机使用枚举值

Java 对交换机使用枚举值,java,enums,Java,Enums,我在课堂上做了如下调整: public enum Aligment { Evil, Neutral, Good, Undefined } 我想在开关中使用这些值,如下所示: System.out.print("Choose you'r start up character" + "1.Good" + "2.Evil" +

我在课堂上做了如下调整:

public enum Aligment
    {
        Evil,
        Neutral,
        Good,
        Undefined
    }
我想在开关中使用这些值,如下所示:

System.out.print("Choose you'r start up character" +
                     "1.Good" +
                     "2.Evil" +
                     "3.Neutral");
    //1  string alignmentChoice = scan.nextLine();
    //2  Aligment alignmentChoice = Aligment.Undefined;
    switch( aligmentChoice )
    {
       case Good:
        alignment = Aligment.Good;
        break;

       case Evil:
        alignment = Aligment.Evil;
        break;

       case Neutral:
        alignment = Aligment.Neutral;
        break;

       default:
        System.out.println("How did you manage to get here? You have broke the system.");
        break;

     }
我不知道如何像//1或//2那样使用它。提前感谢您的帮助。

像这样使用它:

switch(Aligment.valueOf(alignmentChoise)) {
   case Evil: 
     alignment = Aligment.Evil;
     break;
}
注: 如果找不到枚举常量,这将引发
IllegalArgumentException

在枚举内创建一个映射(静态映射),用于保存用户提供的名称与枚举之间的映射

public enum Alignment {
    Evil("Evil"),
    Neutral("Neutral"),
    Good("Good"),
    Undefined("Undefined");

    private static final Map<String, Alignment> MAPPINGS = new HashMap<>();
    static {
        for (Alignment alignment : Alignment.values()) {
            MAPPINGS.put(alignment.getName(), alignment);
        }
    }

    private String name;
    Alignment(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Alignment getAlignmentForName(String name) {
        return MAPPINGS.get(name);
    }
公共枚举对齐{
邪恶(“邪恶”),
中立(“中立”),
好(“好”),
未定义(“未定义”);
私有静态最终映射映射=新HashMap();
静止的{
对于(对齐:Alignment.values()){
MAPPINGS.put(alignment.getName(),alignment);
}
}
私有字符串名称;
对齐(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
公共对齐方式getAlignmentForName(字符串名称){
返回映射。get(name);
}
现在,您可以使用
getAlignmentForName
将用户输入映射到枚举。对于无效值,它将返回
null

这样做的好处是,在添加新的枚举实例时,您不需要更改任何代码……在您的情况下,必须添加适当的开关实例


注意:枚举字段的名称必须按照的大写字母。

如果重构此开关大小写逻辑并将其移动到枚举中的方法,则不再需要使用switch语句从字符串获取枚举

在下面的示例中,我添加了一个方法
fromString()
,该方法将接受字符串输入
name
,并与所有枚举值进行比较(大小写不敏感)

如果没有找到匹配的值,我们抛出一个
IllegalArgumentException

以下是一个例子:

public class AlignmentTest{

     public static void main(String[] args){

        String good = "good";
        String neutral = "NEUTRAL";
        String evil = "EvIl";
        String unknown = "unknown";

        Alignment alignment1 = Alignment.fromString(good);
        System.out.println("Alignment 1: " + alignment1);

        Alignment alignment2 = Alignment.fromString(neutral);
        System.out.println("Alignment 2: " + alignment2);

        Alignment alignment3 = Alignment.fromString(evil);
        System.out.println("Alignment 3: " + alignment3);

        Alignment alignment4 = Alignment.fromString(unknown);
        System.out.println("Alignment 4: " + alignment4);
     }

     public enum Alignment {   
        EVIL("Evil"),
        NEUTRAL("Neutral"),
        GOOD("Good");

        private String name;

        Alignment(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

        public static Alignment fromString(String name) {
            for (Alignment alignment : Alignment.values()) {
                if (alignment.name.equalsIgnoreCase(name)) {
                    return alignment;
                }
            }
            throw new IllegalArgumentException("No alignment with name " + name + " found");
        }
    }
}
这将产生以下结果:

Alignment 1: GOOD
Alignment 2: NEUTRAL
Alignment 3: EVIL
Exception in thread "main" java.lang.IllegalArgumentException: No alignment with name unknown found
    at AlignmentTest$Alignment.fromString(AlignmentTest.java:44)
    at AlignmentTest.main(AlignmentTest.java:19)

您可以像选项2一样使用它。继续尝试并亲自查看!如果
aligmentChoise
属于
Alignment
(这是一个枚举)类型,您应该能够继续这样做。请注意,我专门讨论了如何在switch语句中使用枚举。将用户输入转换为enum是另一回事(如果您要求用户输入数字,请执行类似于
Alignment.values()[index]
的操作。)您在case语句中的意思是“好”、“坏”吗?您缺少了
@Michael:这就是注释!@Glains:谢谢。编辑了答案。@NicholasK注释没有解释这一点。枚举常量只是标识符-变量名。变量名不应该对应用程序的运行时行为产生影响,这一点应该很明显。如果其他开发人员决定重构您的代码以进行更改常量的名称-可能是大写,它们应该是-然后它们无意中破坏了代码,因为您做出了一个糟糕的设计决策。好的。我当时采取了另一种方式。虽然您的观点是正确的,但我只是试图回答问题,而不是重构代码。在我们进行此操作时,枚举成员应该是upp因为它们是常量。Pascal case使它们看起来像内部类。