Краткий ответ
- Отражение многословно по замыслу
- Перевод исключений идиоматичен (перехватывает исключение нижнего уровня и абстрагирует его до более высокого уровня)
- ... но не злоупотребляйте!
- Предпочитать пользовательские исключения для
java.lang.Exception
; это вероятно слишком максимум абстракции
Точка 1: избегать отражения, если это вообще возможно
Вот цитата из Effective Java 2nd Edition, Item 53: Предпочитают интерфейсы для отражения :
[Сила отражения], однако, имеет цену:
- Вы теряете все преимущества проверки времени компиляции, включая проверку исключений.
- Код, необходимый для выполнения отражательного доступа, является неуклюжим и многословным. Это утомительно писать и трудно читать.
- Производительность страдает. Рефлексивный вызов метода намного медленнее, чем обычный вызов метода.
[...] Как правило, объекты не должны отражаться в обычном приложении во время выполнения. Есть несколько сложных приложений, которые требуют отражения. Примеры включают в себя [опущено специально]. Если у вас есть какие-либо сомнения относительно того, попадает ли ваше приложение в одну из этих категорий, оно, вероятно, не соответствует.
Пункт 2: Перевод исключений может быть полезен, но не злоупотребляйте
Вот цитата из Effective Java 2nd Edition, Item 61: Бросьте исключения, соответствующие абстракции .
Это сбивает с толку, когда метод генерирует исключение, которое не имеет видимой связи с задачей, которую он выполняет. Это часто происходит, когда метод распространяет исключение, генерируемое абстракцией более низкого уровня. [...]
Чтобы избежать этой проблемы, более высокие уровни должны перехватывать исключения более низкого уровня и, вместо них, генерировать исключения, которые можно объяснить с помощью абстракции более высокого уровня. Эта идиома известна как исключение перевода .
[...] Хотя трансляция исключений превосходит бессмысленное распространение исключений из нижних уровней, ее не следует злоупотреблять. Там, где это возможно, лучший способ справиться с исключениями из нижних уровней - это избегать их, обеспечивая успешное выполнение методов более низкого уровня. [...]
Если невозможно предотвратить исключения из нижних уровней, следующая лучшая вещь - это заставить верхний уровень молча обходить эти исключения, изолируя вызывающего метода более высокого уровня от проблем более низкого уровня. При этих обстоятельствах может быть целесообразно зарегистрировать исключение, используя некоторое соответствующее средство ведения журнала. Это позволяет администратору исследовать проблему, изолируя от нее код клиента и конечного пользователя.
Точка 3: java.lang.Exception
является слишком общим
Глядя на документацию , можно увидеть длинный список прямых известных подклассов, с широкими темами из Reflection, RMI, синтаксического анализа XML, ввода-вывода, графического интерфейса пользователя, криптографии и т. Д.
Заявление о том, что метод throws Exception
, вероятно, является плохим решением для разработки API, поскольку он не сразу сообщает пользователю что-либо полезное о том, какие категории могут быть исключениями или при каких обстоятельствах они могут быть выброшены. , Сравните это с гипотетическим ReflectionException
; это намного более информативно, и также позволяет пользователю поймать конкретно ReflectionException
, а не, скажем, IOException
, который каким-то образом проскользнул.
Похожие вопросы