嗨,我认识Java很长一段时间,最近我一直深入Java世界.作为一名经验丰富的c#开发人员,我觉得使用Java枚举很奇怪.例如,如果我在控制台项目上显示如下:
public enum AdminOpertionFirstlayer
{MANAGE_SUPPLY,
MANAGE_CUSTOMERS_SERVICE,
ORDERS_MANAGEMENT,
REPORTING_OPRATIONES}
Run Code Online (Sandbox Code Playgroud)
我发现很难将它们写给用户,因为我必须定义新的变量
*AdminOpertionFirstlayer []adminOpertionFirstlayerArr =
AdminOpertionFirstlayer.values();
Run Code Online (Sandbox Code Playgroud)
为了实现这个目标:
for (int i = 0; i < adminOpertionFirstlayerArr.length; i++) {
String s = String.format("%d. %s",
i+1,
adminOpertionFirstlayerArr[i].toString());
Screen.print(s);
}
AdminOpertionFirstlayer chosen= adminOpertionFirstlayerArr
[(Integer.parseInt(dataIn.readLine()))-1];
Run Code Online (Sandbox Code Playgroud)
但我觉得申报*是不好的做法
谢谢
编辑
这样做是可以理解和可读吗?
public enum MainMenuOptiones{
ADMIN {public void secondLayerMenu(){
Main.AdminSecondLayerMenu();}},
CUSTOMER{public void secondLayerMenu(){
Main.customerSecondLayerMenu();}},
EXIT{public void secondLayerMenu(){
System.exit(1);}},
UNAPPLICABLE{public void secondLayerMenu(){
Screen.printToScreen("chice doesnt exist try again");}};
abstract public void secondLayerMenu();
}
Run Code Online (Sandbox Code Playgroud)
phrphes而不是使用我可以使用的所有开关机制
enumInstance.secondLayerMenu();
Run Code Online (Sandbox Code Playgroud)
您可以使用Java的增强型for循环(以及枚举的序数值)
for (AdminOperatorFirstLayer operator : AdminOperatorFirstLayer.values()) {
String s = String.format("%d. %s", operator.ordinal(), operator);
Screen.print(s);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用序数值重新创建枚举:
AdminOperatorFirstLayer chosen =
AdminOperatorFirstLayer.values()[(Integer.parseInt(dataIn.readLine()))];
Run Code Online (Sandbox Code Playgroud)
或者你可以使用这个名字:
for (AdminOperatorFirstLayer operator : AdminOperatorFirstLayer.values()) {
String s = String.format("%s. %s", operator.name(), operator);
Screen.print(s);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用valueOf值来重新创建枚举:
AdminOperatorFirstLayer chosen =
AdminOperatorFirstLayer.valueOf(dataIn.readLine()];
Run Code Online (Sandbox Code Playgroud)