2013-06-14 5 views
-1

Помогите мне, ребята. У меня есть следующие:Java: имя экземпляра Enum в качестве аргумента, возможно ли это?

public class ParserException extends Exception { 
    ParserException(ErrorMessage errorCode) { 
     super(errorCode.getMessageText()); 
    } 

    public enum ErrorMessage { 
     DIVISION_BY_ZERO("Деление на ноль"); 

     private String messageText; 

     ErrorMessage(String text) { 
      this.messageText = text; 
     } 

     public String getMessageText() { 
      return messageText; 
     } 
    } 
} 

Я хочу, чтобы передать мое перечисление имя экземпляра в пути, как это, без необходимости использовать кавычки:

throw new ParserException(DIVISION_BY_ZERO); 

мне не нравится идея включить что-то в класс, в котором я выбрал указанное исключение. (Уже предложено использовать import static blah.blah.ParserException.ErrorMessage.*;)

Есть ли какие-либо другие нежные решения для решения подобных задач? Поскольку вы подозреваете, что я буду рад решить проблему, просто добавив пару строк в свой конструктор ParserException.

Любые хорошие идеи? Спасибо.

+1

Зачем использовать имя переименования * String * в качестве параметра вместо самого перечисления? Только усиление в типе безопасности сделало бы это стоящим. ** Edit: ** О, я вижу, вы говорите о переходе в перечисление, а не в String. Ваш вопрос запутан. Пожалуйста, поймите, что имена переменных и строки не эквивалентны, даже не закрываются. Решение заключается в том, что вы сказали, что вам уже сказали - используйте статический импорт или используйте полное имя перечисления. Почему вы отказываетесь от этих рекомендаций? –

+1

«Мне не нравится идея включить что-то в класс, где я выбрал указанное исключение» <- почему? – fge

+0

Один из вариантов - сделать свой внутренний класс enum 'static' и использовать его как' throw new ParserException (ParserException.ErrorMessage.DIVISION_BY_ZERO); 'но так как вы не хотите добавлять две кавычки вокруг' DIVISION_BY_ZERO' и сделать это Строка Я сомневаюсь, что вам понравится это решение. В любом случае это просто вариант ... – Pshemo

ответ

2

Ну, это возможно, если вы добавите в вашем импорте:

import static complete.package.of.ErrorMessage.*; 

Это означает, что в коде, ErrorMessage.FOO и FOO будет то же самое.

Примечание: Java 5+, но никто не использует Java 4- сегодня, правильно? : Р

Примечание 2: Вы можете также переопределить .toString() в перечислении, просто сделать его вернуть messageText

0

Благодаря неудобного синтаксиса, необходимого для использования внутренних экземпляров перечислений, я хотел бы сделать ваше перечисление класс верхнего уровня (в своем собственном файле java) Если вы это сделаете, использование его станет чистым и простым.

Хотя я предпочитаю избегать раздувания класса, в таких случаях я допускаю это, потому что все проще, что хорошо.

И кто знает ... когда-нибудь вы захотите использовать этот класс в другом месте.

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