Java - Enums ( Numaralandırmalar )

Cumartesi, Mayıs 23, 2015 kustemura 1 Yorum


Bu özellik Java'ya 1.5 sürümüyle beraber eklenmiştir.
Enum adlandırılmış sabitlerden oluşan bir listedir.Örneğin günler gibi.
Java'da numaralandırmalar bir sınıf tipini tanımlarlar.
Bir örnek ile ele alalım.

package com.blogger_project;

/**
 * @Author    : Ali Can Kuştemur
 * @Date      : 22 May 2015
 * @File_Name : EnumDemo.java
 * @Blog      : http://kustemura.blogspot.com.tr 
 */
public class EnumDemo {

 public enum Day {
  PAZARTESI, SALI, CARSAMBA, PERSEMBE, CUMA, CUMARTESİ, PAZAR
 }

 public static void main(final String[] args) {
  Day theDay = Day.PAZARTESI;
  printToday(theDay);

  theDay = Day.PERSEMBE;
  printToday(theDay);

  theDay = Day.valueOf("PERSEMBE");
  printToday(theDay);

  System.out.println();

  for (final Day allDay : Day.values()) {
   System.out.println(allDay);
  }

 }

 public static void printToday(final Day day) {
  if (day == Day.PAZARTESI) {
   System.out.println("Pazartesi gününe bir \"Merhaba\" de bakalım. ");
  } else {
   System.out.println("Bugün şanslı günündesin.");
  }
 }

}
Programın Çıktısı : 
Pazartesi gününe bir "Merhaba" de bakalım. 
Bugün şanslı günündesin.
Bugün şanslı günündesin.

PAZARTESI
SALI
CARSAMBA
PERSEMBE
CUMA
CUMARTESİ
PAZAR
Burada PAZARTESI,SALI ve diğer tanımlayıcılar , numaralandırma sabitleri olarak adlandırılırlar.Her biri kapalı olarak Day'in public,static ve final birer üyesi olarak deklare edilmiştir.Bu sabitlerin tipleri deklare edildikleri tiplerdir yani burada Day tipinde.Enum'lar bir sınıf tipi olmalarına rağmen new anahtar sözcüğü ile bir enum örneği oluşturulamaz;ama bir numaralandırma değişkenini ilkel değişken tiplerinde olduğu gibi aynı şekilde deklare edebilirsiniz. Örneğimizde theDay adında bir Day örneği oluşturduk ve bu örneğe PAZARTESI sabitini atadık.)enumlar if veya switch yapılarında kullanılabilirler.)Ardından printToday() methoduna argüman olarak geçtiğimiz theDay değişkeni ile dönen değere göre yazdırma işlemlerimizi yapıyoruz. valueOf() methoduna aktarılan karakter katarına karşılık gelen sabiti döndürür. "Bugün şanslı günündesin." çıktısının iki adet olduğuna dikkat edin.Bunun sebebi valueOf() methoduna argüman olarak yazdığımız "PERSEMBE" karakter katarının printToday() methodunda else bloğuna düşmesidir. values() methodu çağrıldı enum tipinde bir diziyi döndürür.Burada for-each içerisindeki allDay değişkenine Day enum'unun sabitleri birer birer aktarılır ve ekrana yazdırılır.

Java Numaralandırmaları Sınıf Tipleridir
enum'larda new kullanarak bir enum örneği oluşturamasakta , bunun dışında diğer sınıflar ile aynı yeteneklere sahiptirler.Örneğin numaralandırmalara yapılandırıcı verebilir ,örnek değişken ve methodlar ekleyebilir hatta arabirimler uygulayabilirsiniz.
Bir örnekle inceleyelim.

package com.blogger_project;

/**
 * @Author : Ali Can Kuştemur
 * @Date : 22 May 2015
 * @File_Name : EnumDemo.java
 * @Blog : http://kustemura.blogspot.com.tr
 */
public class EnumDemo {
 enum Fruit {
  Apple(5), Banana(7), Orange(2), Peach(4), Melon(6), WaterMelon;
  private int price;

  Fruit() {
   price = -1;
  }

  Fruit(final int price) {
   setPrice(price);
  }

  void setPrice(final int price) {
   this.price = price;
  }

  int getPrice() {
   return price;
  }

 }

 public static void main(final String args[]) {
  Fruit myFruit = Fruit.Orange;
  System.out.println(myFruit + " : " + myFruit.getPrice() + " $");

  myFruit = Fruit.Peach;
  System.out.println(myFruit + " : " + myFruit.getPrice() + " $");

  System.out.println("Fruit/Melon :" + Fruit.Melon.getPrice() + " $");

  System.out.println();

  System.out.println("Fruit Numaralandırma Sabitleri Listesi ");
  for (final Fruit fruit : Fruit.values()) {
   System.out.println(fruit + " : " + fruit.getPrice() + " $");
  }

 }
}
Orange : 2 $
Peach : 4 $
Fruit/Melon :6 $

Fruit Numaralandırma Sabitleri Listesi 
Apple : 5 $
Banana : 7 $
Orange : 2 $
Peach : 4 $
Melon : 6 $
WaterMelon : -1 $
Constructor değerlerini sabitlere tanımladıktan sonra getPrice() methodu ile Fruit numaralandırıcı sabitlerinin price değerlerine ulaşıp yazdırdık.Bir enum örnek değişkeni oluşturup new ifadesi kullanmadığımıza dikkat edelim. Constructor'u boş geçilen WaterMelon sabiti ise yine sınıflarda olduğu gibi aşırı yüklenebilir.Constructor argümanı boş geçilen sabit'in -1 değer aldığını görüyoruz.Buradaki önemli parçalar :

Fruit myFruit = Fruit.Orange;
myFruit.getPrice(); 
Fruit.Melon.getPrice();
Burada getPrice() methodunun 2 farklı çağrılma şeklini gördük. Numaralandırlar ile ilgili önemli kısıtlamalar: 1 - Bir numaralandırma bir başka sınıfı kalıtımla devralamaz. 2 - Bir enum bir üst sınıf olamaz. ( enum'lar genişletilemezler.) 3 - Her bir numaralandırma sabiti tanımlandığı sınıfın tipinde bir nesne olmalıdır.


package com.blogger_project;

/**
 * @Author : Ali Can Kuştemur
 * @Date : 23 May 2015
 * @File_Name : EnumDemo2.java
 * @Blog : http://kustemura.blogspot.com.tr
 */
public class EnumDemo2 {
 enum Fruit {
  Apple, Banana, Orange, Peach, Melon, WaterMelon;
 }

 public static void main(final String args[]) {

  final Fruit fr1, fr2, fr3;

  for (final Fruit fruit : Fruit.values()) {
   System.out.println(fruit + " : " + fruit.ordinal());
  }

  System.out.println();

  fr1 = Fruit.Apple;
  fr2 = Fruit.Banana;
  fr3 = Fruit.Apple;

  if (fr1.compareTo(fr2) < 0) {
   System.out.println(fr1 + " " + fr2 + "'dan önce gelir.");
  }

  if (fr1.compareTo(fr2) > 0) {
   System.out.println(fr2 + " " + fr1 + "'dan önce gelir.");
  }

  if (fr1.compareTo(fr3) == 0) {
   System.out.println(fr1 + " eşittir " + fr3 + "'a");
  }

  if (fr1.equals(fr3)) {
   System.out.println(fr1 + " eşittir " + fr3 + "'a");
  }

 }
}
Programın Çıktısı : 
Apple : 0
Banana : 1
Orange : 2
Peach : 3
Melon : 4
WaterMelon : 5

Apple Banana'dan önce gelir.
Apple eşittir Apple'a
Apple eşittir Apple'a
Tüm numaralandırmalar java.lang.Enum sınıfını devralır.Bu sınıfın bazı methodları vardır.Bu örnekte for-each döngüsü içerisinde kullanmış olduğum ordinal() methodu ilgili enum sabitinin konumunu integer olarak dönderir.( Dizideki indis(index) mantığı ile aynı) compareTo() methodu ise çağrıldığı sabit ile parametresine aldığı sabit'in konumlarını karşılaştırır.Eğer çağıran sabitin ordinal değeri çağrılandan küçük ise negatif bir değer döndürür.Büyük ise pozitif değer döndürür.Eğer sıfır değerini döndürürse 2 sabitin konumu eşit demektir.Buradaki equals() methodu ise çağıran ve çağrılan sabitlerin her ikiside aynı numaralandırmadan gelen aynı sabite karşılık geliyorsa true döndürür.

1 yorum :

  1. getEnums()
    getEnumConstants()
    getEnumList()
    getEnum()

    bu metotların farkları nedir?

    YanıtlaSil