Некоторые (анти-) шаблоны на использовании утверждают (Java и другие)

14
задан Community 23 May 2017 в 12:19
поделиться

4 ответа

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

правило номер два не состоит в том, чтобы использовать утверждения для существенных проверок. Они могут быть выключены (или, более правильно, не включены). Поскольку проверка параметра незакрытых методов использует IllegalArgumentException.

Утверждения являются исполняемыми предположениями. Я использую утверждения для утверждения моих верований о текущем состоянии программы. Например, вещи как "Я предполагаю, что n положителен здесь" , или , "Я предполагаю, что список имеет точно один элемент здесь" .

9
ответ дан 1 December 2019 в 14:00
поделиться

Вы затронули многие причины, почему я думаю, утверждает, должен избежаться в целом. если Вы не работаете с кодовой базой, где утверждают, что использование имеет очень строгие инструкции, Вы очень быстро входите в ситуацию, где Вы никогда не можете выключать утверждения, в этом случае Вы могли бы также просто использовать нормальные логические тесты.

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

3
ответ дан 1 December 2019 в 14:00
поделиться

Я рекомендую проверить параметры в общественность (API) методы и бросить IllegalArgumentException, если параметрические усилители не допустимы. Нет утверждает здесь, поскольку пользователь API требует для получения надлежащей ошибки (сообщение).

Утверждает, должен использоваться в непубличных методах для проверки постусловий и возможно предварительных условий. Например:

List returnListOfSize(int size) {
    // complex list creation
    assert list.size == size;
}

Часто использование умной стратегии обработки ошибок утверждает, может обойтись.

2
ответ дан 1 December 2019 в 14:00
поделиться

Я использую assert, не только для проверки параметра, но также и используемый для проверки Потоков. Каждый раз, когда я действительно качаюсь, я пишу, утверждают почти в каждом методе для маркировки, "Я должен только быть, выполняются в рабочем потоке/AWTThread". (Я думаю, что Sun должен сделать это для нас.) Из-за модели потоков Swing, это НЕ МОЖЕТ перестать работать (и случайным образом перестать работать) при доступе к API колебания от потока неUI. Довольно трудно узнать все они, проблема без утверждает.

Другой пример я могу, воображение состоит в том, чтобы проверить, что JAR включил ресурс. У Вас может быть английское исключение скорее затем NPE.

<час>

РЕДАКТИРОВАНИЕ: Другой пример; возразите проверке блокировки. Если я знаю, что собираюсь использовать вложенный синхронизируемый блок, или когда я собираюсь зафиксировать мертвую блокировку, я использую Thread.holdLock (Объект) , чтобы гарантировать, что я не получу блокировки в обратном порядке.

<час>

РЕДАКТИРОВАНИЕ (2): Если Вы совершенно уверены, что некоторый блок кода никогда не должен быть досягаемостью, можно записать

throw new AssertionError("You dead");

скорее затем

assert false:"I am lucky";

, Например, если Вы переопределяете, "равняется (Объект)" на изменяемом объекте, хэш-код переопределения () с AssertionError, если Вы полагаете, что это никогда не будет ключ. Эта практика предлагается в некоторых книгах. Я не буду повреждать производительность (поскольку она никогда не должна достигать).

2
ответ дан 1 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: