Enum yapisini anlayabilmeniz icin su ornegi vermek istiyorum, bir kahve dukkaninda short, tall, grande ,venti boyutlarinda secenekler mevcuttur yani bizim ihtiyacimiz olan degisken sadece bu degerleri almalidir. Boyle bir yapiyi Java bize enum aracigiliyla saglayabilir.


enum CoffeeSize { SHORT , TALL , GRANDE ,VENTI };
enum Javada bir anahtar kelimedir. Burada verdigim SHORT, TALL gibi isimler buyuk harf olmak zorunda degil fakat bir Code Convention dir.
Enumlar kendilerine ozel sinif yapisinda tanimlanabildigi gibi bir sinifin uyeside olabilirler. Fakat bir metot icerisinde tanimlanamazlar.


Oncelikle bir sinif disarisinda tanimlayalim. enumlar sinif uyesi olarak tanimlanmadiginda, private veya protected olarak tanimlanamazlar.


JavaCoffeeTest.java


enum CoffeeSize {
SHORT, TALL, GRANDE, VENTI
};


class JavaCoffee {
CoffeeSize size;
}


public class JavaCoffeeTest {
public static void main(String[] args) {
JavaCoffee coffee = new JavaCoffee();
coffee.size = CoffeeSize.VENTI;
System.out.println(coffee.size);
}
}
Ornegimizi inceleyecek olursak bir enum tanimladik, JavaCofee isimli sinifimizin bu enum turunde bir uyesi(member) var (size).
main metodumuz icerisinde bir JavaCoffee nesnesi olusturuyoruz ve size degiskenine VENTI degerini atiyoruz.


Ikinci ornegimizde ise enum yapisini bir sinif uyesi olarak tanimlayalim.Burada sinif uyesi olarak tanimlandiklari icin private ve protected tanimlanabilirler.


JavaCoffeeTest2.java


class JavaCoffee {


protected enum CoffeeSize {
SHORT, TALL, GRANDE, VENTI
};


CoffeeSize size;


}


public class JavaCoffeeTest2 {
public static void main(String[] args) {
JavaCoffee coffee = new JavaCoffee();
coffee.size = JavaCoffee.CoffeeSize.SHORT;
System.out.println(coffee.size);
}
}
Ek bir not olarak enum tanimlamasinin sonuna koyulan noktali virgul (bu iki ornek icin) zorunlu degildir. Ilk basta belirtigim gibi enumlari metotlar icerisinde tanimlayamayiz !
enum lar String degildir, integer degildir. enum i bir tur ozel sinif olarak dusunebiliriz. Listelenen her bir uye (short,tall, grande, venti ) bir CoffeeSize instancedir(ornek).


Enum yapisi su ornek yapiya benzemektedir.


JavaCoffeeSize.java


public class JavaCoffeeSize {
public static final JavaCoffeeSize SHORT = new JavaCoffeeSize("SHORT", 0);
public static final JavaCoffeeSize TALL = new JavaCoffeeSize("TALL", 1);
public static final JavaCoffeeSize GRANDE = new JavaCoffeeSize("GRANDE", 2);
public static final JavaCoffeeSize VENTI = new JavaCoffeeSize("VENTI", 3);


public JavaCoffeeSize(String enumName, int index) {


}
public static void main(String[] args) {
System.out.println(JavaCoffeeSize.GRANDE);
}
}


Enumlar ve Yapilandirici (Constructor) , Metot, Degisken
Enumlar ozel bir sinif yapisi gibidir. Bu nedenle yapilandirici, metot degisken tanimlamamiz mumkundur. Ornegimizi inceleyelim.


JavaCoffee.java


enum CoffeeSize {
SHORT(2), TALL(3), GRANDE(4), VENTI(5);


CoffeeSize(int $){
this.$ = $;
}


private int $;
public int get$() {
return $;
}
};
public class JavaCoffee {


CoffeeSize size;
public static void main(String[] args) {
JavaCoffee coffee1 = new JavaCoffee();
coffee1.size = CoffeeSize.SHORT;


JavaCoffee coffee2 = new JavaCoffee();
coffee2.size = CoffeeSize.TALL;


System.out.println(coffee1.size.get$());
System.out.println(coffee2.size.get$());


for(CoffeeSize cs:CoffeeSize.values()){
System.out.println(cs + " " + cs.get$());
}


}
}
Ornegimizde integer bir deger alan yapilandirici tanimladik ve enum degelerini tanimlarken degerlerini atadik. Dikkat ederseniz $ isminde bir degisken tanimladim, ilk dersten hatirlayacaginiz gibi bu gecerli bir karakter ve isimlendirmedir. Bu private degiskenimizin getter metodunu yazdik. Boylece hem yapilandirici hem degisken hem de metot kullanmis olduk.


JavaCoffee sinifimizda CoffeeSize uyemiz vardir. 2 adet obje olusturduk ve bu objelerimizin size degiskenine (CoffeeSize turunde) SHORT ve TALL degerlerini atadik. Bunlari ekrana yazdirdik.
Son olarak for dongumuzde her enum yapisinda olan static values () metodunu cagirdik.


2
3
SHORT 2
TALL 3
GRANDE 4
VENTI 5


Son ornegimizde ise , metot override islemi gerceklestirecegiz. Dusunelim ki SHORT, TALL , GRANDE icin kodumuz B fakat VENTI icin kodumuz A bunun icin soyle bir yapi kurabiliriz.
Noktali virgulu kullanimi burada zorunludur ! Unutmayalim.


JavaCoffee.java


enum CoffeeSize {
SHORT, TALL, GRANDE, VENTI {
public String getCode() {
return "A";
}
}; // Burada ; zorunludur !


public String getCode() {
return "B";
}
};


public class JavaCoffee {


CoffeeSize size;


public static void main(String[] args) {


for (CoffeeSize cs : CoffeeSize.values()) {
System.out.println(cs + " " + " Code:" + cs.getCode());
}


}
}


SHORT Code:B
TALL Code:B
GRANDE Code:B
VENTI Code:A