# Enum Tipler Javaâda sabit deÄiÅkenler âfinalâ anahtar kelimesi ile oluÅturulabilir. Program yazarken mutlaka bazı durumlarda sabit deÄerlere ihtiyaç duyarız. Elimizdeki bu deÄerleri sabitlerle sınırlandırarak tanımlamamıza fırsat veren yapılara Enum diyoruz. ÃrneÄin bir ödeme kaydının belirli durum deÄerleri olabilir. SUCCESS, PROVISION, FAIL gibi durumlar olabilir. Bu durumlar sırasıyla ödeme baÅarıyla alındı, provizyon aÅamasında beklemede ve baÅarısız oldu gibi deÄerler olsun. Bu deÄerleri âfinalâ anahtar kelimesi ile tanımlayıp ayrı deÄiÅkenler halinde verebilirdik. ÃrneÄin ödemeyi iÅlemi için bir sınıf tasarladıÄımızı düÅünün. AÅaÄıdaki gibi içinde toplam ücreti tutan bir deÄiÅken bir de ödeme durumunu ifade eden sabitler olduÄunu düÅünelim. ```v public class Payment { private final int SUCCESS = 1; private final int PROVISION = 2; private final int FAIL = 3; private double totalValue; private int status; // (SUCCESS-PROVISION-FAIL) durumlardan birini alacak. public Payment() { // kodlar ... } } ``` Yukarıdaki sınıfta bir hata gözükmüyor. Aynen çünkü bir hata oluÅacaksa çalıÅma zamanında (Runtime) oluÅacaktır. Yani, programınız çalıÅırken. Ãdemenin durum bilgisini âintâ tipinde tamsayı olarak tanımladık. AlabileceÄi deÄerleri 3 tane âfinalâ deÄiÅkende tuttuk. Fakat, durumu ifade eden veri tipini sınırlandırmadıÄımız için status deÄiÅkenine gidip 100 gibi bir int tipinde tamsayı da atanabilir. İÅte bu noktada çalıÅma zamanında programınız anlamsız hatalar verebilir. Bunun önüne geçmek için hataları daha derleme aÅamasında alabilmek için âEnumâ yapılarını kullanabiliriz. Javaâda âEnumâ yapıları âenumâ anahtar kelimesi ile tanımlanır. Aynı sınıf tanımlar gibi bir notasyona, yani yazım biçimine sahiptir. âEnumâ yapıların iççinde deÄiÅken, metot ve kurucu metot tanımlayabilirsiniz. ```java public enum PaymentStatus { SUCCESS, PROVISION, FAIL; } ``` Yukarıda en basit haliyle bir âenumâ yapısı tanımlanmıÅtır. Artık ödemeye ait durum deÄeri önceden tanımlanmıŠsabitler ile kontrol altındadır. âintâ veri tipindeki gibi esnek bir Åekilde herhangi bir deÄeri atayamazsınız. Åimdi aynı Payment sınıfına bir enum tipi ekleyerek revize edelim. ```java public class Payment { private double totalValue; private PaymentStatus status = PaymentStatus.SUCCESS; public Payment() { // kodlar ... } } ``` GörüldüÄü gibi artık âstatusâ deÄiÅkeninin tanımlı bir tipi mevcuttur. Bu enum tipinde alabileceÄi sabitlerde bellidir. Bu sabitler dıÅında baÅka bir deÄer ataması yapılamaz. Böylece, çalıÅma zamanında ortaya çıkacak hataların daha derleme aÅamasında önüne geçmiÅ olacaÄız. Aynı zamanda kodun okunabilirliÄini de arttırmıŠolacaÄız. âenumâ yapısı içinde tanımlanmıŠolan sabitler indeks deÄerine sahiptir. Enum içindeki sabitin hangi indeksi ifade ettiÄini anlamak için âordinal()â fonksiyonu kullanılır. ```java PaymentStatus.SUCCESS.ordinal() ``` SUCCESS sabiti enum yapısı içinde ilk eleman olduÄu için indeks deÄeri 0 (sıfır) gelecektir. ## GeliÅmiÅ âenumâ Yapıları âenumâ yapısı içinde kurucu metot, deÄiÅken ve metot tanımlayabileceÄinizden bahsetmiÅtik. Yine PaymentStatus âenumâ yapısı üzerinden örneÄimize devam edelim. BahsettiÄimiz ödeme durum bilgilerine kısa kodlar vermek istediÄimizi düÅünelim. Bu durumda enum yapımızı daha geliÅmiÅ bir Åekilde tasarlamamız gerekiyordu. AÅaÄıda örneÄini görebilirsiniz. ```java public enum PaymentStatus { SUCCESS("200", "İÅlem baÅarılıdır."), PROVISION("202", "İÅlem bankada askıda beklemektedir."), FAIL("500", "İÅlem baÅarısızdır."); // deÄiÅkenler private final String code; private final String description; // kurucu metot, // enum kurucuları private olmalıdır. private PaymentStatus(String code, String description) { this.code = code; this.description = description; } // metotlar public String getCode() { return this.code; } public String getDescription() { return this.description; } } ``` GörüldüÄü üzere deÄiÅkenler, kurucu ve fonksiyonlar tanımlayarak bir enum yapısı kurabiliyoruz. Tüm enum deÄerlerini ekrana yazdırmak istersek aÅaÄıdaki gibi bunu yapabiliriz. âenumâ yapısı içindeki tüm sabitlerin listesini alabilmek için âvalues()â fonksiyonunu kullanabilirsiniz. ```java public class Main { public static void main(String[] args) { PaymentStatus[] paymentStatusList = PaymentStatus.values(); for(PaymentStatus paymentStatus : paymentStatusList) { StringBuilder builder = new StringBuilder(); builder.append("[Code: "); builder.append(paymentStatus.getCode()); builder.append(" - "); builder.append("Description: "); builder.append(paymentStatus.getDescription()); builder.append("]"); System.out.println(builder.toString()); } } } ```