Menu

1 Mayıs 2009 Cuma

Enum

Java'da en cok karsilasilan ve eksikligi hissedilen ozelliklerden birisi C ve C++'ta sikca kullanilan enum operatorudur. Aslinca C tipi enumlar kullanilmasi son derece guvensiz yapilardir. enum sabit degerli bir dizi olusturulur. En cok kullanilan ama kullanilmasi onerilmeyen integer sabitler (C'de oldugu gibi) genellikle java'ya baslayanlarin ilk basvurdugu yontemdir. bu tip enum su nedenlerden oturu sakincalidir.- Typesafe degil, yani kaza ile bir integer bu degerler yerine kullanilabilir. guvensiz kod olusumu- degerlerin basina ek bilgisi eklemek gerekebilir- degerler bilgi verici degil (debug sirasinda ya da log yazilirken sadece rakamlar gorunur.)
public class Almanak {
public static final int MEVSIM_KIS = 0;
public static final int MEVSIM_BAHAR = 1;
public static final int MEVSIM_YAZ = 2;
public static final int MEVSIM_SONBAHAR = 3;
.... }

javada guvenli enum kullanimi icin ciddi tasarim yapmak gerekebiliyordu. Sirf enum siniflari olusturmak icin IDE yazilimlarinda ozel araclar bile kullaniliyor. Normalde guvenli bicimde hakkini vererek gerceklestirmek icin sayfa boyu kod gerektirebilecek oyun kagidi destesi olusturma islemi Java 1.5 typesafe enum, generics ve gelismis for ile asagidaki sekilde kolayca gerceklestirilir. asagida goruldugu gibi sadece enum Tip { maca, sinek, karo, kupa} diyerek dortlu bir kume olusturuluyor. Bu degerler ancak Tip sinifina ait nesnelere atanabilir oldugundan hatali kullanim ihtimali cok dusuktur. Kullanimi da C ve C++'a benzediginden programcilar yabancilik cekmeyecektir. Bu ifadelerin bir switch-case blogunda kullanilmasi da mumkun (bu onceden kodla tasarlanan guvenli enum siniflari icin mumkun degildi)

enum Tip {
maca, sinek, karo, kupa }

enum Deger {
ikili, uclu, dortlu, besli, altili, yedili,
sekizli, dokuzlu, onlu, vale, kiz, papaz, as
}
// desteye kartlari ekle List deste = new ArrayList();
for (Tip tip : Tip.VALUES)
for (Deger deger : Deger.VALUES)
deste.add(new Kart(Tip, Deger));
// desteyi karistir
Collections.shuffle(deste);
Baska bir ornek, bu defa enum sinif oalrak ifade ediliyor. icindeki bilesenlere deger atanabiliyor. Goruldugu gibi sebze enum sinifinda hem sebzeler, hem sebzelerin fiyatlari yuklenebiliyor. Ayrica bu sinifi kullanan yazilimin ikinci parcasinda enum sinifinin switch blogunda nasil kullanilacagi gosteriliyor.

public enum Sebze {
domates(500), salatalik(550), biber(1000), patlican(700);
Sebze( int fiyat) {
this.fiyat = fiyat;
}
private final int fiyat;
public int fiyat () { return fiyat;
}
}
public class SebzeTest { public static void main(String[] args) {
for (Sebze s : Sebze.VALUES)
System.out.println(s + ": \t"
+ s.value() + "bin TL \t" + renk
(s));
}
private enum SebzeRengi {
kirmizi, yesil, mor
}
private static SebzeRengi renk(Sebze s) {
switch (s) {
case domates:
return SebzeRengi.kirmizi;
case patlican:
return SebzeRengi.mor;
case salatalik:
case biber:
return SebzeRengi.yesil;
default:
throw new AssertionError("Bilinmeyen sebze: " + s); }
}
}

Hiç yorum yok:

Yorum Gönder