Ключевое слово Java assert используется для создания утверждений в Java, которые позволяют нам проверять предположения о нашей программе. Например, утверждение может быть направлено на то, чтобы убедиться, что возраст сотрудника является положительным числом и больше 18.
Операторы утверждений Java содержат логическое выражение, которое должно быть истинным при выполнении утверждения. Если оно не истинно, система выдаст AssertionError, если утверждения были включены с помощью флага -ea.
Человек человек = новый Человек(1L, "Локеш", 14);assert person.age() >= 18 : "Возраст меньше 18"; //Ошибка выполнения "java.lang.AssertionError: Возраст меньше 18"
1. Синтаксис утверждений Java
Утверждающее утверждение будет иметь одну из двух форм:
assert expression1;//orassert expression1 : expression2;
Здесь —
- выражение1 — это логическое выражение, которое система оценивает как истинное для обычной обработки, а если оно ложно, выдает AssertionError без подробного сообщения.
- expression2 — это выражение, которое является значением. Оно не может быть вызовом метода, объявленного как void. Система передает значение expression2 соответствующему конструктору AssertionError, который использует строковое представление значения в качестве подробного сообщения об ошибке.
Вторую форму утверждения следует использовать вместо первой только в тех случаях, когда в программе имеется дополнительная информация, которая может помочь диагностировать сбой.
Как и все неперехваченные исключения, ошибки утверждений обычно помечаются в трассировке стека с указанием файла и номера строки, из которой они были выданы.
2. Пример утверждения Java
Оператор assert может помочь в поддержке программирования в стиле design-by-contract. Его можно использовать для проверки предварительных условий, постусловий и других общих утверждений.
Например, для записи о человеке мы хотим обеспечить соблюдение контракта, согласно которому возраст человека должен быть больше 18 лет.
record Person(Long id, String name, int age) {}public class AssertExample {public static void main(String[] args) {Person person = new Person(1L, "Lokesh", 40);//Passes successfullyassert person.age() >= 18 : "Age is less than 18";}}
Это помогает в случаях, когда возраст человека оказывается ниже ожидаемого.
Person person = new Person(1L, "Lokesh", 14);//Fails with AssertionErrorassert person.age() >= 18 : "Age is less than 18";
Это приводит к сбою с настроенным сообщением для легкой отладки.
$ java -ea .\AssertExample.javaException in thread "main" java.lang.AssertionError: Age is less than 18at com.howtodoinjava.core.basic.AssertExample.main(AssertExample.java:14)
В приведенном выше примере посмотрите на сообщение об ошибке утверждения. Оно выводит «Возраст меньше 18», что говорит о том, что значение параметра было проверено и не прошло проверку. Это помогает при отладке.
3. Включение и отключение утверждений
По умолчанию утверждения отключены.
Иногда утверждения могут увеличивать накладные расходы на выполнение программы. Чтобы гарантировать, что утверждения не являются бременем производительности в развернутых приложениях, утверждения можно включать и отключать при запуске программы. После отключения они по сути эквивалентны пустым операторам в семантике и производительности.
- Чтобы включить утверждения с различной степенью детализации, используйте ключ -enableassertions или -ea.
- Чтобы отключить утверждения на разных уровнях детализации, используйте параметр -disableassertions или -da.
Степень детализации можно определить следующим образом:
Уровень детализации | Пример команды | Описание |
---|---|---|
Нет аргументов | java -ea Основной | Включает утверждения во всех классах, кроме системных. |
Имя пакета | java -ea:com.howtodoinjava.dao… Главная | Включает утверждения в названных пакетах и любых подпакетах. |
Неназванные пакеты в текущем рабочем каталоге | java -ea:… Основной | Включает утверждения в безымянном пакете в текущем рабочем каталоге. |
Имя класса | java -ea:com.howtodoinjava.dao.RolesDao Главный | Включает утверждения только в указанном классе. |
Смешанный режим | java -ea:com.howtodoinjava.dao… -da:com.howtodoinjava.dao.RolesDao Главный | Включает утверждения в пакете com.howtodoinjava.dao, но не в классе com.howtodoinjava.dao.RolesDao. |
4. Когда не следует использовать утверждения?
Хотя утверждения полезны для подтверждения предположений, мы не должны использовать их слепо. Например:
- Не включайте утверждения в производственном коде. Они могут привести к снижению производительности из-за дополнительных проверок во время выполнения.
- Утверждения не являются альтернативой правильной обработке ошибок с использованием блоков try-catch и валидаций с использованием аннотаций JSR-380.
- Не используйте утверждения для проверки предположений, связанных с безопасностью, так как они будут отключены в рабочей среде.
5. Заключение
Ключевое слово 'assert' в Java является ценным инструментом. Включая утверждения во время разработки и тестирования, вы можете выявлять проблемы на ранних этапах, документировать предположения и создавать более надежное и поддерживаемое программное обеспечение.
Мы должны использовать их разумно и отключать в рабочем коде, чтобы гарантировать, что производительность приложения не пострадает.