Я работаю в среде, где разработчики используют разные IDE - Eclipse, Netbeans и IntelliJ. Я использую @Nonnull аннотацию (javax.annotation.Nonnull), чтобы указать, что метод никогда не возвращает нуль:@Nonnull с различными IDE - предупреждение о ненужных проверках нуля
@Nonnull
public List<Bar> getBars() {
return bars; // this.bars is a final, initialized list
}
я хотел бы другим разработчикам, чтобы получить предупреждение, если они делают одно из следующих действий:
- Изменить способ вернуть нуль без удаления @Nonnull аннотации
- Излишне проверить нуль методов, которые явно определены с @Nonnull: если (foo.getBars() == NULL) {... что-то ...}
Первый сценарий поддерживается, например. от IntelliJ. Второе - нет; клиенты не предупреждают, что проверка на нуль не нужна.
Мы в любом случае планирования, чтобы двигаться в направлении возвращения клонов коллекций вместо самих коллекций, так что лучше забыть @Nonnull и сделать это вместо того, чтобы:
public List<Bar> getBars() {
return new ArrayList<Bar>(bars);
}
Edit:
Чтобы уточнить, я не рассматриваю возможность изменения IDE для этого. Я хотел бы знать, поддерживается ли то, что я описал выше, упомянутыми IDE - или, альтернативно, если есть веская причина, почему он не поддерживается.
Я понимаю, что не слишком полагаюсь на контракты. Однако, если я напишу getBars() со стилем в последнем абзаце (верните клон списка), то, например, IntelliJ флаги предупреждение для любого кода, который делает
if (foo.getBars() == null) { ... }
Если вы решили следовать за это предупреждение и удалить нулевой чек, вы, кажется, в равной степени зависит от getBars() реализация не меняется. Однако в этом случае вы, кажется, зависите от деталей реализации вместо явного контракта (как в случае с @Nonnull).
Edit # 2:
Я не обеспокоен скоростью исполнения, нулевые чеки действительно очень быстро. Меня беспокоит читаемость кода. Рассмотрим следующее:
Вариант А:
if ((foo.getBars() == null || foo.getBars().size() < MAXIMUM_BARS) &&
(baz.getFoos() == null || baz.getFoos().size() < MAXIMUM_FOOS)) {
// do something
}
Вариант B:
if (foo.getBars().size() < MAXIMUM_BARS &&
baz.getFoos().size() < MAXIMUM_FOOS) {
// do something
}
Я думаю, что вариант B является более удобным для чтения, чем Вариант A. Поскольку код считывается чаще, чем написано, Я хотел бы обеспечить, чтобы весь код I (и другие в нашей команде) был максимально читабельным.
Если вы хотите сделать 2), вы очень сильно зависите от третьей стороны, чтобы сделать то, что она обещал и не изменился. Это действительно то, что вы хотите? Хотя может быть и внутренним, я бы предпочел быть оборонительным и проверить нули, если мой код сломается, если какой-то другой код нарушит его контракт. –
Я не понял актуального вопроса - что вам нужно? Я не могу себе представить, что вы хотите отойти от IntelliJ, потому что он пропускает одну возможную диагностику. Вы хотите, чтобы IntelliJ поддерживал эту диагностику? Отправьте отчет об ошибке, если хотите. То же самое касается Eclipse и Netbeans. И что это за последний абзац? – Cubic
Ну, вы можете создать метод утилиты, который охватывает случай «null», и перейти 'Util.size (foo.getBars())