2010-11-27 3 views
1

привет Я знаю Java в течение длительного времени, а недавно я глубоко погружался в мир Java. Как опытный разработчик C#, мне кажется странным использовать Java enum. Например, если я покажу на консольных элементов, таких как:Что такое лучшая практика Java для обработки enum's

public enum AdminOpertionFirstlayer 
{MANAGE_SUPPLY, 
MANAGE_CUSTOMERS_SERVICE, 
ORDERS_MANAGEMENT, 
REPORTING_OPRATIONES} 

Я считаю, что трудно записать их к пользователю, потому что я должен определить новый varible

*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]; 

Но я чувствую, что это плохая практика, чтобы объявить о *

  1. Есть ли наилучшая практика (расширение enum является одним ...)?
  2. Имеется ли TryParse или каждый раз, когда я разбираю, я должен попробовать и поймать?

спасибо

EDIT

делает делает это понятным и читаемым?

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(); 
+1

Не начинайте с прописных букв для имен переменных. Это сбивает с толку, поскольку имена, начинающиеся с прописных букв, обычно являются именами классов. См. [Кодовые обозначения для языка программирования Java] (http://www.oracle.com/technetwork/java/codeconv-138413.html). – Progman 2010-11-27 08:56:39

ответ

5

Вы можете использовать в Java усовершенствован для цикла (и порядкового значения для перечисления)

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()]; 
+0

и как его разобрать? это не решение ... и я не существует в этом контексте. – 2010-11-27 08:41:27

+0

Не нужно ниспровергать его ответ! Что в нем для него? – trojanfoe 2010-11-27 08:52:58

1

Enum<E> класс является базовым для всех перечислений в Java.

Нет необходимости объявлять переменную со значениями, использовать расширенный цикл для печати, если вы хотите, чтобы пользователи прочитали ваш исходный код.

Обычно вы хотите распечатать локализованную строку, а не имя переименования в источнике.

Существует не эквивалент TryParse, вместо этого используйте AdminOpertionFirstlayer.valueOf(AdminOpertionFirstlayer.class, string) и поймайте исключение IllegalArgumentException.

Смежные вопросы