Pure Java – 52 Assertion Mechanism

Merhaba Arkadaslar,
Bu yazimda Java’da yer alan Assertion mekanizmasindan bahsedecegim.

Java 1.4 ile gelen “assert” bir anahtar kelimedir.

Bir metoda arguman olarak sayi gecirdigimizi dusunelim, (methodA()) fakat bu sayi negatif bir sayi olmamalidir. Bu kontrolu normal sartlarda su sekilde yapabiliriz ;

private void methodA(int num) {
if (num >= 0) {
useNum(num + x);
} else { // num must be < 0
// This code should never be reached!
System.out.println("Yikes! num is a negative number! "
+ num);
}
}

methodA() ici validate islemini assertion mekanizmasi ile yapabiliriz ;

private void methodA(int num) {
	asssert(num>0);
	useNum(num+x);
}

Assertion mekanizmasi gayet basit olarak calisir. Ilgili assertion sarti true olmazsa exception(error) firlatilacaktir(AssertionError).
Eger true donecekse her sey yolunda olacak ve kod akisi devam edecektir

Assertion mekanizmasi 2 formatta yazilabilir  ; simple , really simple

Really simple ;

private void doStuff() {
assert (y > x);
// more code assuming y is greater than x
}

Simple;

private void doStuff() {
assert (y > x): "y is " + y + " x is " + x;
// more code assuming y is greater than x
}

Assertion Expression Rules/Kurallari
Assertion mekanizmasi bir ya da iki exression’a sahip olabilir. Simple ya da Really Simple olmasina gore.
Birinci expression’in sonucu mutlaka boolean olmalidir! Ikinci expression sonuc donduren(value) herhangi bir expression olabilir. Simple assertion ornegimizde ikinci expression String ; bu bir nevi System.out.println() gibi calisacaktir.

void noReturn() { }
int aReturn() { return 1; }
void go() {
int x = 1;
boolean b = true;

// bu assert statement'lari legaldir.
assert(x == 1);
assert(b);
assert true;
assert(x == 1) :x;
assert(x == 1) :aReturn();
assert(x == 1) :new ValidAssert();

// ILLEGAL assert statement'lari
assert(x = 1); // boolean degil,
assert(x);  // boolean degil
assert 0; // boolean degil
assert(x == 1) : ; // donus degeri(value) yok
assert(x == 1) : noReturn(); //donus degeri(value) yok
assert(x == 1) : ValidAssert va; // donus degeri(value) yok
}

Enabling Assertions
Assertion mekanizmasini kullanabilmek icin oncelikle enable/aktif hale nasil getirebilecegimizi bilmemiz gerekmektedir.
Hatirlayacagimiz gibi assert anahtar kelimesi Java 1.4 ile birlikte gelmistir. Java 1.4 ten once bu kelime bir identifier olarak kullanilabilir.

// Java 1.4 oncesi
int assert = getInitialValue();
if (assert == getActualResult()) {
// do something
}

Test.class

public class TestClass {

	public static void main(String[] args) {
		int x=1;
		assert(x==2);

		System.out.println("Assert Mekanizmasi aktif degil!");
	}
}

TestClass’imizi komut satirinda derleyelim ve Assert mekanizmasinin enabled/disabled oldugu durumlara gore bakalim;

assert

Assertion mekanizmasi varsayilan/default olarak kapalidir(diabled) , aktif hale getirmek icin java komutu ile birlikte -ea ya da -enableassertions ifadesini kullanmaliyiz. Assertion mekanizmasinin kapali oldugu durumda(disabled) , assert kontrolu pas gecildi ve false assert kontrolu nedeniyle error(AssertError) firlatilmadi fakat assert kontrolunun pas gecilmedigi durumlarda yani assertion mekanizmasinin aktif edildigi durumda false sonuc AssertionError firlatilmasina neden oldu.

Assertion mekanizmasini paket seviyesinde de enabled/disabled yapabiliriz.

asssert enabled disabled

Using Assertions Appropriately
Bu konu basliginda , Assertions mekanizmasinin uygun yerlerde kullanimi inceliyecegiz.

Assertion mekanizmasini public metotlarla kullanmak uygun degildir.(inappropriate)

public void doStuff(int x) {
assert (x > 0); // inappropriate 
}

Assertion mekanizmasini private metotlarla kullanmak uygundur.(appropriate)

private void doStuff(int x) {
assert (x > 0); // appropriate 
}

Assertion mekanizmasini Command-line argumanlari icin kullanmak uygun degildir( inappropriate)

Assertion mekanizmasini , metodumuz public bile olsa kodumuzun kontrol edilmeyen(check) senaryolari icin kullanmak uygundur(appropriate) .

Ornek switch kod yapisinda , default kismina hic ulasilmamali. Bu konuda bir assert statement’ti yazilabilir.

switch(x) {
case 1: y = 3; break;
case 2: y = 9; break;
case 3: y = 27; break;
default: assert false; // we're never supposed to get here!
}

Assertion mekanizmasini side effect(yan tesir) gosterecek sekilde kullanmak uygun degildir.

public void doStuff() {
   assert (modifyThings());
   // continues on
}
public boolean modifyThings() {
   y = x++;
   return true;
}

assert mekanizmasinin her zaman calisacaginin bir garantisi yoktur. Bu nedenle burada oldugu gibi icerisinden bir metot cagirmak ve side effect yapacak sekilde kullanmak uygun degildir. Assertion mekanizmasinin yan etkisi (side effect) olmamalidir.

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply to Levent Erguder Cancel reply

Your email address will not be published. Required fields are marked *