Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Эффективный элемент Java № 38 "Проверка параметров для достоверности" (Google Books, Amazon.com) дает полезную информацию о различии между проверкой параметров и соответствующим использованием утверждений.

Связанные с SO: (включение утверждений в netbeans), (утверждения или исключения), (около дубликатов, просьба о примерах), (плохо названный, но очень похожий контент)

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Чтобы быть точным на ваш вопрос:

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

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/git/javadoc/com/google/common/base/Strings.html

Ответ 5

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

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

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

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