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使它们看起来像内部类。