Шаг 60.
Язык программирования Java.
Применение утверждений

На этом шаге мы рассмотрим применение утверждений

Утверждения - широко распространенное средство так называемого безопасного программирования. Допустим, вы в своей программе используете функцию sqrt, которая находит корень из числа. Перед тем как ее вызывать вы можете сделать проверку на то, чтобы переданное ей число не было отрицательным. И если оно все таки отрицательное то бросить исключение. Сделать это можно следующим образом:

void test(int x)  throws IllegalArgumentException {
	...
	if (x < 0) {
		throw new IllegalArgumentException();
	}
	double y = Math.sqrt(x);
	...
}

Но у такого подхода имеется следующий существенный недостаток: приведенная выше проверка останется в программе, даже после завершения ее тестирования и подобных проверок в программе может быть очень много, из-за чего выполнение программы может замедлиться. Механизм утверждения позволяет вводить в исходный код программы проверки для ее тестирования, а затем удалять их из окончательного варианта. Для этой цели есть ключевое слово assert. Ниже приведены две ее основные формы:

assert условие;
assert условие : выражение;

Обе формы проверяют заданное условие и генерируют исключение типа AssertionError, если оно не выполняется. Во второй форме выражение передается конструктору объекта типа AssertionError и преобразуется в символьную строку сообщения.

Перепишем теперь метод test() с использование утверждений:

void test(int x) {
	...
	assert x >= 0 : x;
	double y = Math.sqrt(x);
	...
}

В данном примере происходит проверка на то чтобы, переданное число было неотрицательным. Если оно будет отрицательным, то будет сгенерировано исключение AssertionError с указанием какое число было передано функции test().

По умолчанию утверждения запрещены. Разрешить их в ходе выполнения программы можно с помощью параметра -enableassertions или -ea, указываемого в командной строке следующим образом:

    java -ea MyApp

Заметим, что для разрешения и запрета утверждений компилировать программу заново не нужно. Это задача загрузчика классов. Если диагностические утверждения запрещены, загрузчик классов игнорирует их код, чтобы не замедлять выполнение программы.

Разрешать утверждения можно в отдельных классах или даже в целых пакетах. Это можно сделать следующим образом:

    java -ea:MyClass -ea:ru.kgsu.it … MyApp

Это команда разрешает утверждение в классе MyClass, а также во всех классах пакета ru.kgsu.it и его подчиненных пакетов. Параметр -ea:… разрешает утверждения во всех классах из пакета, выбираемого по умолчанию.

Кроме того, утверждения можно запретить в определенных классах и пакетах. Для этого достаточно указать параметр -disableassertions или -da в командной строке следующим образом:

    java -ea:... -da:MyClass MyApp

Некоторые классы загружаются не загрузчиком классов, а непосредственно виртуальной машиной. Для выборочного разрешения или запрета утверждений, содержащихся в этих классах, можно также указать указать параметр -ea и -da в командной строке. Но эти параметры разрешают и запрещают все утверждения одновременно, и поэтому их нельзя применять в “системных классах” без загрузчика классов. Для разрешения утверждений, находящихся в “системных классах”, следует указать параметр -esa. Также имеется возможность программно управлять состоянием утверждений. Об этом вы можете прочитать в документации.

Когда же следует применять утверждения? Чтобы правильно ответить на этот вопрос, необходимо учесть следующее:

Утверждения не следует применять в качестве индикаторов несущественных и легко исправимых ошибок. Они предназначены для выявления серьезных неполадок во время тестирования.

Многие программисты оформляют свои предположения о работе программы в виде комментариев. Утверждения бывают удобными для самопроверки в процессе программирования.

На следующем шаге мы начнем говорить про обобщенное программирование

Предыдущий шаг Содержание Следующий шаг