Java-Design: состояние перечисления? - PullRequest
2 голосов
/ 28 февраля 2012

Я понимаю (прочитав также другие посты на SO), что это плохой дизайн (или лучше сказать, что в моем случае это также не имеет смысла) добавлять состояние в константы перечисления.

Тем не менее я нахожуЯ прямо сейчас в ситуации, когда мне нужно что-то похожее на это.Приложение, которое я пишу, использует константы ошибок (enum), которые я использую для обозначения ошибок, добавляя их к Map<Error, ErrorInfo> (обратите внимание, что это не ошибки приложения, а «Ошибки», которые являются частью приложения).Хорошо - теперь я понимаю, что мне действительно нужно указать ErrorLevel INFO, WARN, FATAL для них.Поскольку ErrorLevel ошибки зависит от контекста, в котором она произошла, я не могу статически назначить ErrorLevel-значениям Error-enums, другими словами, Error.E1 может иметь значение ErrorLevel.WARN один раз, но может быть ErrorLevel.FATAL другое время.

Я думаю о том, как лучше всего включить это ErrorLevel в свой дизайн, но все, что я до сих пор придумывал, - это ввести новый класс, который просто оборачивает Error иErrorLevel и используйте его в Map вместо Error.

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

- qu

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Если я правильно понял вашу проблему, установка переходного состояния в enum не сработает. Поскольку для каждого типа перечисления существует только один экземпляр путем изменения уровня ошибки, вы измените его не только для текущей ошибки, которую вы оцениваете, но и для всех ошибок того же типа в приложении.

Вы писали, уровень ошибки зависит от контекста и в то же время ErrorInfo описывает контекст возникновения ошибки. Если вы можете рассчитать уровень ошибки на основе типа ошибки и контекста, я бы предложил некоторый статический метод

public static ErrorLevel getLevel(Error, ErrorInfo) {
  //..
}
1 голос
/ 28 февраля 2012

Я не совсем согласен, что это всегда плохой дизайн, добавляющий изменяемое состояние в перечисления.Перечисления похожи на синглтоны, и всякий раз, когда имеет смысл использовать синглтон с состоянием в вашем приложении, вы можете сделать то же самое с enum.Как и в случае синглетами, мы просто должны помнить, что изменение состояния имеет довольно глобальный эффект.

Конечно, перечисления с сохранением состояния не помогут в вашем случае, потому что вы хотите, чтобы уровни ошибок зависели от контекста.

В качестве альтернативы рассмотрите возможность использования простой мультикарты:

Map<Context, Map<Error, ErrorLevel>> errors;

Идея состоит в том, чтобы хранить несколько карт для разных контекстов.Таким образом, для известного контекста (я быстро изобрел тип ...) вы получаете контекстно-зависимую карту параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...