Ключевое слово Assert в Java
Вы используете assert
Ключевое слово или выбросить какое-то исключение во время выполнения проверки? Какие преимущества это дает вам или почему вы думаете, что оно того не стоит?
5 ответов
Assert выдаст ошибку времени выполнения ( AssertionError), если его условие ложно. Утверждения предоставляют вам упрощенный способ документирования, проверки и применения критериев правильности вашего кода. Преимущества - это языковой хук для определения и манипулирования этими условиями корректности. Если вы хотите включить или отключить их (есть аргументы относительно того, является ли это хорошей идеей), вы можете сделать это из командной строки JVM. Некоторые комментаторы ниже отмечают, что утверждения по умолчанию отключены, если они не работают в режиме отладки; Моя практика заключается в том, чтобы всегда добавлять "-ea" (включить утверждения) в мои скрипты-оболочки. Даже в коде, чувствительном к производительности, компромисс для меня важен для уверенности в безопасности / правильности, которую я получаю из утверждений. Утверждения в Oracle и описание API для AssertionError
Обратите внимание на различие между ожидаемыми или неожиданными сбоями (исключениями), которые могут быть вне вашего контроля, и сбоями утверждений - ошибки подтверждений документируют предположения программиста и указывают на неверную программу, а не на неожиданное внешнее условие или ожидаемое исключительное условие. Если происходит сбой утверждения, интерпретация заключается в том, что программист неправильно понял или неправильно выразил программу, а не другие источники ошибок или сбоев.
На практике я использую его для документирования очевидных или неочевидных допущений, которые я делаю, и инвариантов, которые я хочу применять при создании (особенно частного / внутреннего) кода, чтобы было ясно для меня и других, почему эти допущения сделаны, где они сделано, и будут ли они подтверждены. Гораздо лучше, чем комментарии к тому же эффекту. Это (маленький) шаг к проектированию по контракту.
Действующий элемент Java № 38 "Проверка параметров на достоверность" ( Google Books, Amazon.com) предоставляет полезную информацию о различии между проверкой параметров и надлежащим использованием утверждений.
Относится к SO: ( Включение утверждений в netbeans), ( Утверждения против исключений), ( Почти дубликаты, просят примеров), ( Плохо названо, но очень похожий контент)
Андерсой это правильно. Просто для того, чтобы вы знали, самое важное в утверждениях состоит в том, что вы можете просто отключить их (если вы не передаете -ea в командной строке Java). Эта простая вещь делает их идеальными для использования в разработке, когда вы хотите быть уверены, что не нарушаете свой собственный код.
Какие преимущества это дает вам или почему вы думаете, что это не стоит использовать?
Использование утверждений для обязательных проверок, как рекомендовали другие, является опасной практикой.
Что происходит, когда другой разработчик использует вашу библиотеку? Или системный администратор или опытный пользователь забывает, или, что еще хуже, не знает, чтобы включить утверждения с флагом -ea во время выполнения? Вы потеряете все эти чеки, вот что.
Утверждения являются инструментом разработки. Тот факт, что состояние флага по умолчанию выключено, является мертвой раздачей.
Никакая функция или выгода в вашем приложении никогда не должны зависеть от того, на каком утверждении.
В качестве фона утверждения используются таким же образом в C/C++, откуда была взята функция. В C/C++ разработчик обычно может передать #define DEBUG ...
во время компиляции, чтобы включить или отключить утверждения. В производственном коде C/C++ эта функция обычно отключена.
Концептуально, то же самое должно быть верно для Java. В производстве используются условные и исключения. По сути, это одно и то же.
Если быть точным по вашему вопросу:
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/git/javadoc/com/google/common/base/Strings.html
Вы можете использовать это, чтобы включить что-то во время разработки, а затем полностью отключить это на живом сайте. например
...
assert debug("xxx");
...
static boolean debug(String format, Object... args){ print(...); return true; }
оператор отладки добавит ноль накладных расходов на живой сайт.