четверг, 28 апреля 2011 г.

Java assertions

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

Чтобы такого не допустить, то нам нужно писать проверку в таких методах и кидать исключение если-что.
Это в условиях спешной разработки утомительно, особенно если этот этап передачи строго внунтренний(который не соприкасается с внешним миром) и в условиях отлаженного приложения, в него будут приходитьс всегда подходящие данные. Поэтому жертвовать в таких условиях временем на написание исключений нет, тем более если в них нет нужды.
Тут приходят в помощь assertions(предположения), кототрые при влчюченных опциях java-ланчера будут ломать приложенение(выкидывать ошибки), что хорошо на этапах тестирования и разработки, помогая выявлять места, из которых приходят искаженные данные.

assert true; // приложение не сломается
assert false; //приложение сломается
assert (arg1!=0; arg2>5 && arg2<9); //а вот реальный пример применения 
 
Этото вариант использования выражения просто завалит приложение без либо-каких сообщений. Если все же нужно выводить сообщение, то нужно пользоваться вот таким видом выражения:

assert Expression1:Expression2;

Expression1 -- это булиновское значение, а
Expression2 -- это метод, который вернет сообщение, или просто строка сообщения.

А вот длинный вариант записи:
throw new AssertionError(); 
throw new AssertionError("Message"); 

Включение и выключение предположений:
Ланчер имеет две опции для влючения и выключения преположений(-ea и -da), эти опции имеют следующие аргументы:
  • без аргументов
       Вкл/выкл во всех классах, кроме системных
  • packageName...
       Вкл/выкл в пакете и в его подпакетах.
  • ...
       Вкл/выкл в классах находящихся в неименованном пакете -- те классы, которые находятся в поточном пакете.
  • className
       Вкл/выкл в конкретном классе.
Вот пример запуска приложения BatTutor, при этом предположения будут включены в пакете com.wombat.fruitbat и его подпакетах, а также в неименованном пакете:

java -ea:com.wombat.fruitbat... BatTutor 
 
А вот в этом примере мы сначала включаем предположения в пакете  com.wombat.fruitbat, а также в неименованном пакете, потом выключаем предположения в конкретном классе этого пакета.

java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat BatTutor

Мы можем также включить предположения в системных классах:

java -esa -ea:com.wombat.fruitbat... BatTutor

Комментариев нет:

Отправить комментарий