Как показать, что метод может вернуть ноль - PullRequest
43 голосов
/ 04 января 2009

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

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

Некоторые способы, которыми я могу придумать:

  • Запишите это в спецификации / документации (кто-нибудь прочитает?)
  • Сделать его частью имени метода (как я и предлагал здесь )
  • Предположим, что каждый метод, который выдает исключение, не возвращает ноль, а каждый метод, который не 'throw' может возвращать ноль.

Я в основном говорю о java, но это может относиться и к другим языкам: почему существует формальный способ выражения, если генерируются исключения (ключевые слова throws), но нет формального способа выражения, если ноль может быть возвращенным?

Почему нет чего-то подобного:

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 никогда не повредит, а иногда даже помогает.
  • Использование имен методов для документирования обнуляемости возвращаемого значения не было предложено никем, кроме меня, и хотя оно может быть очень многословным и не всегда полезным, я все же считаю, что иногда оно тоже имеет свои преимущества .

Ответы [ 11 ]

0 голосов
/ 04 января 2009

Если вы используете Java 5+, вы можете использовать пользовательскую аннотацию, например, @ MayReturnNull

UPDATE

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

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