После публикации этот вопрос и читать то один я понял, что очень важно знать, должен ли метод возвращать значение null, или если это считается условием ошибки, и следует исключить исключения. Также есть хорошая дискуссия, когда возвращает 'null или исключение throw.
Я пишу метод, и я уже знаю, хочу ли я вернуть null или исключить исключение, что является лучшим способом выразить свое решение, другими словами, документировать мой контракт?
Некоторые способы, о которых я могу думать:
- Запишите это в спецификациях/документации (прочитает ли кто-нибудь?)
- Сделайте это частью имени метода (как я предложил )
- Предположим, что каждый метод, который генерирует исключение, не будет возвращать null, и каждый, который делает "не", может возвращать null.
В основном я говорю о java, но это может относиться и к другим языкам: почему существует формальный способ выражения, если будут выбраны исключения (ключевые слова throws
), но нет формального способа выражения, если null может быть возвращенным?
Почему этого не происходит:
public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
return null; // this would lead to a compiler error!
}
Резюме и заключение
Существует много способов выражения контракта:
- Если ваша IDE поддерживает его (как IntelliJ), лучше всего использовать аннотацию типа
@NotNull
, потому что она видна программисту и может использоваться для автоматической проверки времени компиляции. Там добавлен плагин для Eclipse, но для меня это не сработало. - Если это не вариант, используйте пользовательские типы, такие как
Option<T>
илиNotNull<T>
, которые добавляют ясность и, по крайней мере, проверку времени выполнения. - В любом случае документирование контракта в JavaDoc никогда не повредит, а иногда даже помогает.
- Использование имен методов для документирования nullability возвращаемого значения не было предложено кем-либо, кроме меня, и хотя это может быть очень многословным и не всегда полезным, я по-прежнему полагаю, что иногда оно также имеет свои преимущества.