Ключевое слово Assert в Java - PullRequest
       12

Ключевое слово Assert в Java

39 голосов
/ 27 сентября 2010

Используете ли вы ключевое слово assert или генерируете какое-то исключение во время выполнения проверки?Какие преимущества это дает вам или почему вы думаете, что оно того не стоит?

Ответы [ 5 ]

62 голосов
/ 27 сентября 2010

Assert выдаст ошибку времени выполнения ( AssertionError ), если его условие ложно. Утверждения предоставляют вам упрощенный способ документирования, проверки и применения критериев правильности вашего кода. Преимущества - это языковой хук для определения и манипулирования этими условиями корректности. Если вы хотите включить или отключить их (есть аргументы относительно того, является ли это хорошей идеей), вы можете сделать это из командной строки JVM. Некоторые комментаторы ниже отмечают, что утверждения по умолчанию отключены, если они не работают в режиме отладки; Моя практика заключается в том, чтобы всегда добавлять «-ea» (включить утверждения) в мои скрипты-оболочки. Даже в коде, чувствительном к производительности, компромисс для меня важен для уверенности в безопасности / правильности, которую я получаю из утверждений. Утверждения в Oracle и Описание API для AssertionError

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

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

Действующий элемент Java # 38 «Проверка параметров на достоверность» ( Google Книги , Amazon.com ) предоставляет полезную информацию о различии между проверкой параметров и надлежащим использованием утверждений.

Относится к SO: ( Включение утверждений в NetBeans ), ( Утверждения и исключения ), ( Почти в двух экземплярах, запрос примеров ), ( Плохо названный, но очень похожий контент )

4 голосов
/ 27 сентября 2010

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

3 голосов
/ 22 апреля 2015

Какие преимущества это дает вам или почему вы считаете, что его не стоит использовать?

Использование утверждений для обязательных проверок, как рекомендовали другие, - опасная практика .

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

Утверждения являются инструментом разработки.Тот факт, что для флага по умолчанию установлено значение off , является мертвой раздачей.

Никакая функция или преимущество в вашем приложении никогда не должны зависеть от того, на каком активе есть утверждение.

В качестве фона утверждения используются таким же образом в C / C ++, где функциябыл взят из.В C / C ++ разработчик обычно может передать #define DEBUG ... во время компиляции, чтобы включить или отключить утверждения.В производственном коде C / C ++ эта функция обычно отключена.

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

0 голосов
/ 05 сентября 2014

Если быть точным в вашем вопросе:

Assert используется для проверки условия оператора.

assert (some condition)
Example : assert (6 < 7) // condition pass
          assert (6 > 7) // throws AssertionException here

Большинство людей используют assert для следующего варианта использования для String: (НоЛично я ненавижу использовать assert для этого):

assert (obj != null || obj.isEmpty() || ... )

Мне скорее нравится использовать Google Guava, который чист и служит цели:

Obj.isNullOrEmpty()

Дополнительная информация: http://docs.guava -libraries.googlecode.com / мерзавец / Javadoc / COM / Google / общие / база / Strings.html

0 голосов
/ 27 сентября 2010

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

...
assert debug("xxx");
...

static boolean debug(String format, Object... args){ print(...); return true; }

оператор отладки добавит ноль накладных расходов на работающий сайт.

...