утверждения , в теории, для тестирования инварианты , предположения, которые должны быть верными для кода для завершения правильно.
показанный пример тестирует на допустимый вход, который не является типичным использованием для утверждения, потому что это, обычно, пользователь предоставил.
Утверждения обычно не используются в производственном коде, потому что существуют издержки, и предполагается, что ситуации, где сбой инвариантов были пойманы как кодирование ошибок во время разработки и тестирования.
Ваша точка о них прибывающий "поздно" в Java является также причиной, почему они более широко не замечены.
кроме того, платформы поблочного тестирования позволяют, чтобы часть потребности в программируемых утверждениях была внешней к протестированному коду.
Это - злоупотребление утверждениями для использования их для входа проверочного пользователя. Бросок IllegalArgumentException
на недопустимом входе более корректен, поскольку это позволяет вызывающему методу поймать исключение, отобразить ошибку и сделать то, в чем это нуждается к (попросите вход снова, выйдите, безотносительно).
, Если тот метод является закрытым методом в одном из Ваших классов, утверждение прекрасно, потому что Вы просто пытаетесь удостовериться, что Вы случайно не передаете его нулевой аргумент. Вы тестируете с утверждениями на, и когда Вы протестировали все пути через и не инициировали утверждение, можно выключить их так, чтобы Вы не тратили впустую ресурсы на них. Они также полезны так же, как комментарии. assert
в начале метода хорошая документация специалистам по обслуживанию, что они должны следовать за определенными предварительными условиями, и assert
в конце с постусловием документы, что должен делать метод. Они могут быть столь же полезными как комментарии; moreso, потому что с утверждениями на, они на самом деле ТЕСТИРУЮТ то, что они документируют.
Утверждения для тестирования/отладки, не проверки ошибок, которая является, почему они прочь по умолчанию: отговаривать людей использовать утверждения для проверки ввода данных пользователем.
От Программирование с Утверждениями
По умолчанию, утверждения отключены во времени выполнения. Два переключателя командной строки позволяют Вам выборочно включать или отключать утверждения.
Это означает, что, если Вы не имеете полного контроля над средой выполнения, Вы не можете гарантировать, что код утверждения даже назовут. Утверждения предназначены, чтобы использоваться в тестовой среде, не для производственного кода. Вы не можете заменить обработку исключений утверждениями, потому что, если пользователь запускает Ваше приложение с отключенными утверждениями ( значение по умолчанию ), весь Ваш код обработки ошибок исчезает.
В "Эффективном Java", предложенный Joshua Bloch (в "Параметрах проверки для законности" тема), что (вид подобных простое правило принять), для открытых методов, мы проверим аргументы и выдадим необходимое исключение, если найдено недопустимое, и для непубличных методов (которые не представлены и Вы как, пользователь их должен гарантировать их законность), мы можем использовать утверждение вместо этого.
yc
@Don, Вы расстроены, что утверждение выключено по умолчанию. Я был также и таким образом записал этот небольшой javac плагин, который встраивает их (т.е. испускает байт-код для if (!expr) throw Ex
, а не это глупое утверждает байт-код.
, Если Вы включаете fa.jar в свой путь к классу при компиляции кода Java, он сделает свое волшебство и затем скажет
Note: %n assertions inlined.
@see http://smallwiki.unibe.ch/adriankuhn/javacompiler/forceassertions и альтернативно на github https://github.com/akuhn/javac
Утверждения очень ограничены: можно только протестировать булевы условия, и необходимо записать код для полезного сообщения об ошибке каждый раз. Сравните это с assertEquals JUNIT (), который позволяет генерировать полезное сообщение об ошибке от исходных данных и даже показывать два исходных данные рядом в IDE в бегуне JUnit.
кроме того, Вы не можете искать утверждения ни в каком IDE, который я видел до сих пор, но каждый IDE может искать вызовы метода.
На самом деле они прибыли в Java 1.4
, я думаю, что основная проблема состоит в том, что, когда Вы кодируете в среде, где Вы не управляете непосредственно jvm опциями собой как в затмении или серверах J2EE (в обоих случаях возможно изменить jvm опции, но необходимо глубоко искать для нахождения, где это может быть сделано), это легче (я подразумеваю, что требуется меньше усилия) использовать если и исключения (или хуже для не использования чего-либо).
Я не уверен, зачем вам писать asserts, а затем заменить их стандартным условным оператором if then, почему бы просто не записать условия, как если бы в первую очередь?
Утверждения предназначены только для тестирования и имеют два побочных эффекта: