Pure Java – 44 Flow Control – 02

Merhaba Arkadaslar,
Bu bolumde Java’da switch statement/ifadesini inceleyecegiz. switch statement/ifadesini coklu if-else yapisi yerine kullanabiliriz. Oncelikle bildigimiz tarzda basit bir ornek kod gorelim sonrasinda detayli noktalarini inceleyelim.

SwitchTest.java

package purejava44;

public class SwitchTest {
	public static void main(String[] args) {
		int x = 3;
		if (x == 1) {

			System.out.println("x esittir 1");
		} else if (x == 2) {
			System.out.println("x esittir 2");
		} else if (x == 3) {
			System.out.println("x esittir 3");
		} else {
			System.out.println("x hakkinda bilgim yok!");
		}

		switch (x) {
		case 1:
			System.out.println("x esittir 1");
			break;
		case 2:
			System.out.println("x esittir 2");
			break;
		case 3:
			System.out.println("x esittir 3");
			break;
		default:
			System.out.println("x hakkinda bilgim yok!");
		}
	}
}

switch statement/ifadesinin genel formu

switch (expression) {
case constant1: code block
case constant2: code block
default: code block
}

Java 6 da, switch ifadesinin expression kismi char, byte, short , int tipinde ya da bu primitive tiplerin wrapper siniflari olan Character, Byte, Short, Integer tipinde ya da enum olabilir ,fakat long , float, double tipinde ya da bu primitive tiplerin wrapper siniflari olan Long , Float , Double  tipinde olamaz. Java 7 de ek olarak String tipinde de olabilir.

Simdi biraz daha detaya inelim ve ozellikle sinav icin bilmemiz gereken noktalara deginelim.

1) case constant/sabiti , compile time/derleme zamani sabiti olmalidir. Ne demek istedigimi kod uzerinde gorelim ;

SwitchTest2.java

public class SwitchTest2 {

	public static void main(String[] args) {
		final int a = 1;  
		final int b;
		b = 2;
		int c=3;

		int x = 0;
		switch (x) {
		case a:
		// ok
		case b: // compiler error //derleme hatasi

		case c: // compile error //derleme hatasi

		}
	}
}

dikkat ederseniz b ve c degiskeninin case ifadesinde kullanimi derleme hatasina neden olacaktir, degiskenin final olmasi yeterli olmamakta ancak ve ancak ilk tanimlandigi yerde/declare deger atanmasi gerekmektedir.

2) case constant/sabiti ,switch expression’da kullandigimiz degiskenin tipine uygun deger araliginda olmalidir.

SwitchTest3.java

public class SwitchTest3 {
	public static void main(String[] args) {
		byte b=10;

		switch(b){
		case 25:
		case 100:
		//case 128: // 128 degeri byte tipinin degeri disindadir. 
		//bu nedenle cast etmek gerekir ya da derleme hatasina neden olur
		case (byte)128:
		}
	}
}

3)case ifadesinde birden fazla ayni deger kullanilamaz.

byte b=10;

switch(b){
    case 25:
    case 100: //derleme hatasi
    case 100; //derleme hatasi
}

4) Wrapper sinif tipinde expression kullanabiliriz.

switch(new Integer(4)) {
    case 4: System.out.println("boxing is OK");
}

5) switch-case yapisi icin dikkat etmemiz bir kac yazim kurali bulunmaktadir. Su kod orneklerini inceleyelim ;

switch(x) {
    case 0 { // case expression'dan sonra iki nokta(:) gerekli.
        int y = 7;
    }
}

switch(x) {
    0: { } //case ifadesi eksik !
    1: { } //case ifadesi eksik !
}


break & fall-through

switch-case yapisinda break statement/ifadesi secimliktir.
case constant/sabitleri kontrolu yukaridan asagida dogru olmaktadir, eger break kullanmazsak ilk eslesen case constant/sabitinden itibaren asagiya dogru devam etmektedir.

SwitchTest4.java

enum Color {
	red, green, blue
}

public class SwitchTest4 {
	public static void main(String[] args) {
		Color c = Color.green;
		switch (c) {
		case red:
			System.out.print("red ");
		case green:
			System.out.print("green ");
		case blue:
			System.out.print("blue ");
		default:
			System.out.println("done");
		}

		int x = 1;
		switch(x) {
		case 1: System.out.println("x is one");
		case 2: System.out.println("x is two");
		case 3: System.out.println("x is three");
		}

	}
}

green degeri icin  eslesme oldugu icin green blue done olarak cikti olacaktir. Benzer sekilde x=1 degeri icin 3 case ifadesi de calisacaktir. Bu yapiya fall-through denilmektedir.

break kullandigimiz da ise ilgili sart saglandiktan sonra switch-case yapisindan cikilacaktir.

int x = 1;
switch(x) {
case 1: {
    System.out.println("x is one"); break;
}
case 2: {
    System.out.println("x is two"); break;
}
case 3: {
    System.out.println("x is two"); break;
}
}


default keyword

Java’da default anahtar kelimedir/keyword ve switch-case yapisinda istege bagli olarak kullanilabilir.

SwitchTest5.java

public class SwitchTest5 {
	public static void main(String[] args) {
		int x = 7;
		switch (x) {
		case 2:
		case 4:
		case 6:
		case 8:
		case 10: {
			System.out.println("x cift sayidir");
			break;
		}
		default:
			System.out.println("x tek sayidir");
		}
	}
}


default
anahtar kelimesi switch-case yapisinda en sona gelmek zorunda degildir. Birinci switch ifadesinde x=2 icin ilk sart saglandiktan sonra sirasiyla case’ler calisacaktir. Ikinci switch ifadesinde x=7 oldugu icin default calisacaktir ve yukaridan asagiya dogru fall-through gerceklesecektir. Yani fall-through kuralimiz default icin de gecerlidir.

public class SwitchTest6 {
	public static void main(String[] args) {
		int x = 2;
		switch (x) {
		case 2:
			System.out.println("2");
		default:
			System.out.println("default");
		case 3:
			System.out.println("3");
		case 4:
			System.out.println("4");
		}

		System.out.println("Test 2");
		x = 7;

		switch (x) {
		case 2:
			System.out.println("2");
		default:
			System.out.println("default");
		case 3:
			System.out.println("3");
		case 4:
			System.out.println("4");
		}

	}
}

 

Yazimi burada sonlandiriyorum.

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

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