嗨,我知道Java很长一段时间,最近我一直深入Java世界。 作为一名经验丰富的c#开发人员,我觉得使用Java枚举很奇怪。 例如,如果我在控制台项目上显示,例如:
public enum AdminOpertionFirstlayer
{MANAGE_SUPPLY,
MANAGE_CUSTOMERS_SERVICE,
ORDERS_MANAGEMENT,
REPORTING_OPRATIONES}
我觉得很难把它们写给用户,因为我必须定义新的变量
*AdminOpertionFirstlayer []adminOpertionFirstlayerArr =
AdminOpertionFirstlayer.values();
为了实现这个目标:
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];
但我觉得在*
上宣布是不好的做法谢谢
修改
这样做是否可以理解和可读?
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();
}
phrphes不是使用所有的开关机制 我可以用
enumInstance.secondLayerMenu();
答案 0 :(得分:5)
您可以使用Java的增强型for循环(以及枚举的序数值)
for (AdminOperatorFirstLayer operator : AdminOperatorFirstLayer.values()) {
String s = String.format("%d. %s", operator.ordinal(), operator);
Screen.print(s);
}
然后您可以使用序数值重新创建枚举:
AdminOperatorFirstLayer chosen =
AdminOperatorFirstLayer.values()[(Integer.parseInt(dataIn.readLine()))];
或者您可以使用名称:
for (AdminOperatorFirstLayer operator : AdminOperatorFirstLayer.values()) {
String s = String.format("%s. %s", operator.name(), operator);
Screen.print(s);
}
然后您可以使用valueOf值重新创建枚举:
AdminOperatorFirstLayer chosen =
AdminOperatorFirstLayer.valueOf(dataIn.readLine()];
答案 1 :(得分:1)
Enum<E>
类是Java中所有枚举的基础。
如果您希望用户阅读您的源代码,则无需使用值声明变量,使用增强的for循环将其打印出来。
通常,您希望打印出本地化的字符串,而不是源代码中枚举的名称。
没有等效于TryParse
,而是使用AdminOpertionFirstlayer.valueOf(AdminOpertionFirstlayer.class, string)
并捕获IllegalArgumentException。