Monday, September 13, 2010

Enum

Javaya enum yapisi 1.5 versiyonundan sonra geldi.enum'lar normal siniflara benze ama bircok kisitlama getirilmistir. enum yapisi olusturulmada evel static final int seklinde tanimlanan degiskenler tanimlaniyordu ama bu bir cok sorunun cikmasina neden oluyordu. Aslinda enum tanimini yapmak yrine enum'larin nasil kullanildigi ile ilgili uygulamalar ile anlatma istiyorum.
Javada enum tanimlamak icin enum keyword yararlanilir. Daha sonra enum elemanlari {} arasina yazilir.
public enum Sebzeler {
    DOMATEZ,BIBER,PATLICAN,SALATALIK
}
Yukarda bir enum tanimladik simdi biraz daha ilerleyere bu enumdaki degerleri nasil alabiliriz.
public class TestMain {
    public static void main(String args[]) {
        System.out.println(Sebzeler.DOMATEZ);
        System.out.println(Sebzeler.BIBER);
        System.out.println(Sebzeler.PATLICAN);
        System.out.println(Sebzeler.SALATALIK);
    }
}
 //Console Output
DOMATEZ
BIBER
PATLICAN
SALATALIK 
Simdide enum icindeki methodlari inceliyelim

values() : Enum'daki elemanlari bir dizi seklinde elde etmemizi sagliyor
public class TestMain {
   
    public static void main(String args[]) {
       for (Sebzeler s : Sebzeler.values()) {
            System.out.println(s.ordinal());
        }
    }
}
//Console Output
DOMATEZ
BIBER
PATLICAN
SALATALIK

ordinal() : Isetile bir enum elemanin kacinci sirada oldugunu bildirir. burada ilk deger sifirdan basliyor.
public class TestMain {
    public static void main(String args[]) {
        System.out.println(Sebzeler.BIBER.ordinal());
        System.out.println(Sebzeler.DOMATEZ.ordinal());
        System.out.println(Sebzeler.SALATALIK.ordinal());
        System.out.println(Sebzeler.PATLICAN.ordinal());
    }
}
//Console Output
1
0
3
2

valueOf(String name) :Enum isindeki elemanlarin ismini biliyorsak valueOf methodunun parametresine istenilen enum elemanin adini yazarak elde edebiliriz.

 public class TestMain {
    public static void main(String args[]) {
        for (Sebzeler s : Sebzeler.values()) {
            System.out.println(Sebzeler.valueOf(s.name()));
        }
    }
}
//Console Output
DOMATEZ
BIBER
PATLICAN
SALATALIK
Yada bu methodun daha iyi anlasilmasi icin sunu yapabiliriz
public class TestMain {
    public static void main(String args[]) {
        System.out.println(Sebzeler.valueOf("BIBER"));

    }
}
//Console Output
BIBER 

Simdide enumlar ile ilgili farkli noktalara deyinelim
  •  Enum elemanlarinin deger almasi ve bu degerlerini kullanilmasi
public enum Sebzeler {

    DOMATEZ(100), BIBER(200), PATLICAN(300), SALATALIK(400);
    int fiyat;

    Sebzeler(int fiyat) {
        this.fiyat = fiyat;
    }
}

Yukarida enum elemanlarina deger verdim ama bu degerleri Constructor parametre degeri ne ise elemanlarda o tipte degerler aliyor.

public class TestMain {
    public static void main(String args[]) {
        for (Sebzeler f : Sebzeler.values()) {
            System.out.println(f.name() +" : "+f.fiyat);
        }

    }
}

//Console Output
DOMATEZ : 100
BIBER : 200
PATLICAN : 300
SALATALIK : 400

public enum Sebzeler {
    DOMATEZ("Kirmizi"), BIBER("Yesil"), PATLICAN("Siyah"), SALATALIK("Yesil");

    String renkler;

    Sebzeler(String renkler) {
        this.renkler = renkler;
    }
}


public class TestMain {
    public static void main(String args[]) {
        for (Sebzeler f : Sebzeler.values()) {
            System.out.println(f.name() +" : "+f.renkler);
        }
    }
}

//Console Output
DOMATEZ : Kirmizi
BIBER : Yesil
PATLICAN : Siyah
SALATALIK : Yesil

  • Simdide enum elemanlarina method ekleme islemine geciyoruz

public enum Hesapla {
  TOPLA{ double islem(double x, double y) { return x + y; } },
  CIKAR{ double islem(double x, double y) { return x - y; } },
  CARP { double islem(double x, double y) { return x * y; } },
  BOL  { double islem(double x, double y) { return x / y; } };

    abstract double islem(double x, double y);
}


public class TestMain {
    public static void main(String args[]) {
        System.out.println("2 + 3 : "+Hesapla.TOPLA.islem(2, 3));
    }
}

//Console Output
2 + 3 : 5.0
  • Enum'lar kalitim yetenegine sahip degiller
  • Enum'larin Constructor public olamaz.
  • Enum yapisi interface'yi implement edebilir.
Az once yaptigimiz Hesapla enum'unu interface yetenegi ile beraber yapalim

public interface Hesap {
    double islem(double x, double y);
}

public enum Hesapla implements Hesap {

    TOPLA{
        @Override
        public double islem(double x, double y) {
            return x + y;
        }
    },
    CIKAR{
        @Override
        public double islem(double x, double y) {
            return x - y;
        }
    },
    CARP{
        @Override
        public double islem(double x, double y) {
            return x * y;
        }
    },
    BOL{
        @Override
        public double islem(double x, double y) {
            return x / y;
        }
    };

}

public class TestMain {
    public static void main(String args[]) {
        System.out.println("2 + 3 : "+Hesapla.TOPLA.islem(2, 3));
        System.out.println("2 * 3 : "+Hesapla.CARP.islem(2, 3));
        System.out.println("2 - 3 : "+Hesapla.CIKAR.islem(2, 3));
    }
}

//Console Output
2 + 3 : 5.0
2 * 3 : 6.0
2 - 3 : -1.0

Yukeridaki interface kullanarak yazdigim ornegi bir baska sekilde kullanimi

public class TestMain {
    public static void main(String args[]) {
        for(Hesapla h : Hesapla.values()){
            System.out.println(h.name() +" : "+ h.islem(4, 2));
        }
    }
}

//Console Output
TOPLA : 6.0
CIKAR : 2.0
CARP : 8.0
BOL : 2.0
  • Enum konusunu inceliyorken EnumSet sinifinida incelemeden gecemiyecem
public enum Gunler {
    PAZARTESI("Monday") , SALI("Tuesday") , CARSAMBA("Wednesday") , PERSEMBE("Thursday") , CUMA("Friday") , CUMARTESI("Saturday") , PAZAR("Sunday");

    String eng;

    Gunler(String eng){
        this.eng = eng;
    }
}

public class TestMain {

    public static void main(String args[]) {
        EnumSet d = EnumSet.range(Gunler.PAZARTESI, Gunler.PERSEMBE);
        System.out.println(d);
    }
}

//Console Output
[PAZARTESI, SALI, CARSAMBA, PERSEMBE]

public class TestMain {
    public static void main(String args[]) {
        EnumSet d = EnumSet.allOf(Gunler.class);
        for(Gunler g: d.clone()){
            System.out.println(g);
        }
    }
}
//Console Output
 PAZARTESI
SALI
CARSAMBA
PERSEMBE
CUMA
CUMARTESI
PAZAR

public class TestMain {

    public static void main(String args[]) {
        for(Gunler g: EnumSet.allOf(Gunler.class)){
            System.out.println(g);
        }
    }
}

//Console Output
 PAZARTESI
SALI
CARSAMBA
PERSEMBE
CUMA
CUMARTESI
PAZAR



public class TestMain {

    public static void main(String args[]) {
        for(Gunler g : EnumSet.of(Gunler.PAZARTESI, Gunler.CUMA)){
            System.out.println(g);
        }
    }
}

//Console Output
PAZARTESI
CUMA

public class TestMain {

    public static void main(String args[]) {
        EnumSet es = EnumSet.allOf(Gunler.class);
        EnumSet e=  EnumSet.complementOf(es);
        e.add(Gunler.SALI);
        System.out.println(e);
    }
}

//Console Output
[SALI]

public class TestMain {

    public static void main(String args[]) {
        System.out.println(EnumSet.noneOf(Gunler.class));
    }
}

//Console Output
[]

No comments:

Post a Comment