Я согласен с вашим желанием создать исключение. Это хорошо для производительности (в качестве исключения стоит тысяча инструкций для построения трассировки стека), и это логично, когда вы говорите, что часто бывает так, что он не найден (следовательно, он не является исключительным состояние).
Я думаю, что for loop
, который вы упомянули, является правильным, если у вас есть только несколько значений enum. Это, вероятно, будет иметь лучшую производительность из всех. Но я понимаю, что вы этого не хотите.
Вы можете создать карту, чтобы найти значения перечисления, которые позволят избежать исключения и одновременно вернуть соответствующее перечисление.
Обновление: Trejkaz уже опубликовал код, который делает это.
Также обратите внимание, что иногда вместо возврата null
в качестве возвращаемого типа, когда ни один экземпляр не совпадает, некоторые перечисления имеют выделенный экземпляр для этого (например, назовите его EMPTY или NOT_FOUND). Преимущество состоит в том, что весь вызывающий код не должен иметь дело с нулями, и не рискует NullPointerException
. При необходимости, может быть логический метод, который говорит isFound()
(возвращает истину за исключением этого экземпляра). И коды, которые действительно должны отличать эти значения от других, все еще могут, в то время как те, которые не заботятся, просто передают экземпляр без знания этого особого случая.