Подход № 3: arg.getClass();
умный, но если этот идиома не получит широкого распространения, я бы предпочел более четкие, более подробные методы вместо сохранения нескольких символов,Я программист типа «пиши один раз, читай много».
Другие подходы - самодокументирование: есть лог-сообщение, которое можно использовать, чтобы уточнить, что произошло - это лог-сообщение используется при чтении кода.а также во время выполнения.arg.getClass()
само по себе не является самодокументированным.Вы можете использовать комментарий, по крайней мере, чтобы разъяснить рецензентам код:
arg.getClass(); // null check
Но у вас все еще нет возможности поместить конкретное сообщение во время выполнения, как вы можете использовать другие методы.
Подход № 1 против № 2 (нулевая проверка + NPE / IAE против подтверждения): Я стараюсь следовать следующим правилам:
http://data.opengeo.org/GEOT-290810-1755-708.pdf
Используйте assert
для проверки параметров частных методов
assert param > 0;
Использовать нулевую проверку + IllegalArgumentException
для проверки параметров в открытых методах
if (param == null) throw new IllegalArgumentException("param cannot be null");
Использовать нулевую проверку + NullPointerException, где это необходимо
if (getChild() == null) throw new NullPointerException("node must have children");
HOWEVER , так как это может быть вопрос о выявлении потенциальных проблем null
наиболеетогда я должен упомянуть, что мой предпочтительный метод для работы с null
- это использование статического анализа, например, аннотации типов (например, @NonNull
) а-ля JSR-305 .Мой любимый инструмент для их проверки:
The Checker Framework:
Пользовательские подключаемые типы для Java
https://checkerframework.org/manual/#checker-guarantees
Если это мой проект (например, не библиотека с общедоступнойAPI), и если я могу использовать Checker Framework везде:
, я могу более четко задокументировать свое намерение в API (например, этот параметр может быть не нулевым (по умолчанию), но этотможет быть нулевым (@Nullable
; метод может возвращать нулевое значение и т. д.). Эта аннотация находится непосредственно в объявлении, а не дальше в Javadoc, поэтому вероятность ее сохранения гораздо выше.
статический анализ более эффективен, чем любая проверка во время выполнения
статический анализ заранее помечает потенциальные логические недостатки (например,попытался передать переменную, которая может быть нулевой, в метод, который принимает только ненулевой параметр), а не в зависимости от проблемы, возникающей во время выполнения.
Еще один бонус заключается в том, что инструментпозвольте мне разместить аннотациив комментарии (например, `/ @ Nullable /), так что код моей библиотеки может быть совместим с проектами с аннотациями типа и проектами без аннотации типов (не то чтобы у меня их нет).
В случае, если ссылка снова не работает , вот раздел из Руководства разработчика GeoTools:
http://data.opengeo.org/GEOT-290810-1755-708.pdf
5.1.7 ИспользованиеУтверждения, IllegalArgumentException и NPE
Язык Java уже пару лет делает доступным ключевое слово assert;это ключевое слово может использоваться для проверки отладки.Хотя существует несколько способов использования этого средства, распространенным является проверка параметров метода в частных (не общедоступных) методах.Другие применения - постусловия и инварианты.
Ссылка: Программирование с утверждениями
Предварительные условия (например, проверка аргументов в частных методах)как правило, легкие цели для утверждений.Постусловия и инварианты иногда менее просты, но более ценны, поскольку нетривиальные условия имеют больше рисков для нарушения.
- Пример 1: После проекции карты в ссылкахмодуль, утверждение выполняет обратную проекцию карты и проверяет результат с исходной точкой (постусловие).
- Пример 2: В реализациях DirectPosition.equals (Object), если результатЗначение true, тогда утверждение гарантирует, что hashCode () идентичны, как того требует контракт объекта.
Используйте Assert для проверки параметров в приватных методах
private double scale( int scaleDenominator ){
assert scaleDenominator > 0;
return 1 / (double) scaleDenominator;
}
Вы можете включить утверждения с помощью следующего параметра командной строки:
java -ea MyApp
Вы можете включить только утверждения GeoTools со следующим параметром командной строки:
java -ea:org.geotools MyApp
Вы можете отключить утверждения для определенного пакета, как показано здесь:
java -ea:org.geotools -da:org.geotools.referencing MyApp
Используйте IllegalArgumentException для проверки параметров в открытых методах
Использование утверждений в открытых методах строго не рекомендуется; потому что сообщаемая ошибка была сделана в коде клиента - будьте честны и
скажите им заранее с IllegalArgumentException, когда они облажались.
public double toScale( int scaleDenominator ){
if( scaleDenominator > 0 ){
throw new IllegalArgumentException( "scaleDenominator must be greater than 0");
}
return 1 / (double) scaleDenominator;
}
При необходимости используйте исключение NullPointerException
Если возможно, выполнить собственные проверки на ноль; выбрасывание IllegalArgumentException или NullPointerException с подробной информацией
о том, что пошло не так.
public double toScale( Integer scaleDenominator ){
if( scaleDenominator == null ){
throw new NullPointerException( "scaleDenominator must be provided");
}
if( scaleDenominator > 0 ){
throw new IllegalArgumentException( "scaleDenominator must be greater than 0");
}
return 1 / (double) scaleDenominator;
}