在 Java 中使用枚举而不是开关
Using enums instead of switch in Java
我正在使用枚举而不是开关,但是有一个问题。在 switch 中你可以有一个 default case。但是使用枚举呢?当我提供与定义的枚举不同的输入时,我的程序崩溃了。
例如:
public enum InputChar {
X,Y,Z;
/**
* get an input character
* @return a String description of the input character
*/
@Override
public String toString()
{
String s = "";
if (this.ordinal() == 0)
s = "X";
else if (this.ordinal() == 1)
s = "Y";
else if (this.ordinal() == 2)
s = "Z";
return s;
}
}
我正在使用它:
private void checkInput(String charEntered)
{
textDoc = new textDoc (InputChar.valueOf(charEntered));
}
我研究过但无法正常工作。考虑过在 toString() 中加入 else 语句,但似乎无法在其中加入 deafult
...
您始终可以捕获抛出的异常并提供您自己的默认值
InputChar c=InputChar.X;
trý {
c=InputChar.valueOf(charEntered);
} catch (IllegalArgumentException e){
System.out.println("I don't know what to do with " + charEntered+", defaulting to X");
}
两件事:
- 默认情况下,枚举有一个默认实现,它只是 returns 它的
.name()
;因此你在这里的覆盖是多余的;
- 枚举是 类 "like any others" (几乎是这样)所以它们有构造函数;如果要"add"数据到一个枚举中,正确的做法是:
public enum MyEnum
{
FOO("my data"),
;
private final String whatever;
MyEnum(final String whatever)
{
this.whatever = whatever;
}
public String getWhatever()
{
return whatever;
}
}
可以通过三种方式做到这一点:
如果-其他
比较每个序数值和 return 对应的值。
public enum InputChar {
X, Y, Z;
@Override
public String toString() {
if (this.ordinal() == 0) {
return "X";
} else if (this.ordinal() == 1) {
return "Y";
} else if (this.ordinal() == 2) {
return "Z";
} else {
return "";
}
}
}
切换
打开序数值和return一个相应的值。
public enum InputChar {
X, Y, Z;
@Override
public String toString() {
switch (this.ordinal()) {
case 0:
return "X";
case 1:
return "Y";
case 2:
return "Z";
default:
return "";
}
}
}
枚举属性
Return 枚举的赋值。
public enum InputChar {
X("X"),
Y("Y"),
Z("Z");
private String value;
private InputChar(String value) {
this.value = value;
}
@Override
public String toString() {
return this.value;
}
}
优化查找
通过 属性 快速查找枚举的最佳方法是创建查找 table。
import java.util.LinkedHashMap;
import java.util.Map;
public enum InputChar {
X("X"),
Y("Y"),
Z("Z");
private static final Map<String, InputChar> lookup;
static {
lookup = new LinkedHashMap<>();
for (InputChar inChar : values()) {
lookup.put(inChar.value, inChar);
}
}
private String value;
private InputChar(String value) {
this.value = value;
}
@Override
public String toString() {
return this.value;
}
public InputChar findByValue(String value) {
return lookup.get(value);
}
}
尝试以下
enum InputChar {
X("X"),
Y("Y"),
Z("Z"),
DEFAULT("D");
private String value;
private InputChar(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
public static InputChar getEnum(String value)
{
for (InputChar v : values())
if (v.toString().equalsIgnoreCase(value))
return v;
return InputChar.DEFAULT;
}}
主要
System.out.println(InputChar.getEnum("X"));
System.out.println(InputChar.getEnum("A"));
对我有用
我正在使用枚举而不是开关,但是有一个问题。在 switch 中你可以有一个 default case。但是使用枚举呢?当我提供与定义的枚举不同的输入时,我的程序崩溃了。
例如:
public enum InputChar {
X,Y,Z;
/**
* get an input character
* @return a String description of the input character
*/
@Override
public String toString()
{
String s = "";
if (this.ordinal() == 0)
s = "X";
else if (this.ordinal() == 1)
s = "Y";
else if (this.ordinal() == 2)
s = "Z";
return s;
}
}
我正在使用它:
private void checkInput(String charEntered)
{
textDoc = new textDoc (InputChar.valueOf(charEntered));
}
我研究过但无法正常工作。考虑过在 toString() 中加入 else 语句,但似乎无法在其中加入 deafult
...
您始终可以捕获抛出的异常并提供您自己的默认值
InputChar c=InputChar.X;
trý {
c=InputChar.valueOf(charEntered);
} catch (IllegalArgumentException e){
System.out.println("I don't know what to do with " + charEntered+", defaulting to X");
}
两件事:
- 默认情况下,枚举有一个默认实现,它只是 returns 它的
.name()
;因此你在这里的覆盖是多余的; - 枚举是 类 "like any others" (几乎是这样)所以它们有构造函数;如果要"add"数据到一个枚举中,正确的做法是:
public enum MyEnum
{
FOO("my data"),
;
private final String whatever;
MyEnum(final String whatever)
{
this.whatever = whatever;
}
public String getWhatever()
{
return whatever;
}
}
可以通过三种方式做到这一点:
如果-其他
比较每个序数值和 return 对应的值。
public enum InputChar {
X, Y, Z;
@Override
public String toString() {
if (this.ordinal() == 0) {
return "X";
} else if (this.ordinal() == 1) {
return "Y";
} else if (this.ordinal() == 2) {
return "Z";
} else {
return "";
}
}
}
切换
打开序数值和return一个相应的值。
public enum InputChar {
X, Y, Z;
@Override
public String toString() {
switch (this.ordinal()) {
case 0:
return "X";
case 1:
return "Y";
case 2:
return "Z";
default:
return "";
}
}
}
枚举属性
Return 枚举的赋值。
public enum InputChar {
X("X"),
Y("Y"),
Z("Z");
private String value;
private InputChar(String value) {
this.value = value;
}
@Override
public String toString() {
return this.value;
}
}
优化查找
通过 属性 快速查找枚举的最佳方法是创建查找 table。
import java.util.LinkedHashMap;
import java.util.Map;
public enum InputChar {
X("X"),
Y("Y"),
Z("Z");
private static final Map<String, InputChar> lookup;
static {
lookup = new LinkedHashMap<>();
for (InputChar inChar : values()) {
lookup.put(inChar.value, inChar);
}
}
private String value;
private InputChar(String value) {
this.value = value;
}
@Override
public String toString() {
return this.value;
}
public InputChar findByValue(String value) {
return lookup.get(value);
}
}
尝试以下
enum InputChar {
X("X"),
Y("Y"),
Z("Z"),
DEFAULT("D");
private String value;
private InputChar(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
public static InputChar getEnum(String value)
{
for (InputChar v : values())
if (v.toString().equalsIgnoreCase(value))
return v;
return InputChar.DEFAULT;
}}
主要
System.out.println(InputChar.getEnum("X"));
System.out.println(InputChar.getEnum("A"));
对我有用