2 Ağustos 2015 Pazar

Programlama Dillerinde Enumeration

Not : Hibernate yani JPA ile enum kullanmak ta bazen zor olabiliyor. Konuyla ilgili buraya göz atabilirsiniz.

Enum'u Arayüz Olarak Kullanmak
Bu iyi bir fikir.

Programlama Dillerinde Enum
Java
Aşağıda Java için enum notlarım var.

Enum Sınıfı final'dır
enum Myenum {} şeklinden tanımlanan yapı, derleyici tarafından java.lang.Enum sınıfından kalıtır ve final olarak tanımlanır. Aşağıda bir örnek var.
final class Suit extends java.lang.Enum<Suit> {
  public static final Suit SPADES;
  public static final Suit HEARTS;
  public static final Suit CLUBS;
  public static final Suit DIAMONDS;
  private static final Suit[] $VALUES;
  public static Suit[] values();
  public static Suit valueOf(java.lang.String);
  private Suit();
}

java.lang.Enum sınıfı bazı metodlar sunar. Bunlardan önemli olanları aşağıda yazdım.

Enum Sınıfının Önemli metodları
name metodu
Enum'un ismini verir.
 
ordinal metodu
Enum'un sırasal olarak değerini verir.

Not : Konu ile ilgili olarak Hibernate ile Enum Alanının Ordinal Değerinden Farklı Bir Değer Kullanmak başlıklı yazıya göz atabilirsiniz.
 
values metodu
Tüm enumların üzerinden döngüyle dönebilmemizi sağlar.
enum DayOfWeek {
  U, M, T, W, R, F, S
}

for (DayOfWeek day : DayOfWeek.values()) {
  System.out.println(day.toString());
}    

valueOf metodu
İsmi yani name()'i verilen Enum nesnesini döndürür.


Enum Bir Multiton'dır
Enum sınıfındaki her bir alan için public static bir nesne yaratılır. Yani Enum sınıfları da Garbage Collector tarafından silinmezler. Ancak tanım olarak Enum Singleton yerine Multiton olarak  düşünülmeli.  Multiton name-value çifti şeklinde ve sınırlı sayıda yaratılan nesneleri temsil eder.

C#
Enumeration yazısına taşıdım.

Enum'u String'e Çevirmek
Java
Kendi metodumuzu kullanmak
Genellikle Typesafe Enum örüntüsüne dayalı bir yöntem kullanılıyor. Bu yöntemde enum'un private constructor metodu ve istenilen alanı veren bir getter metodu oluyor.

Aşağıdaki örnekte enum alanlara string atanıyor ve tanımlanan bir metod ile enum'un string karşılığı alınıyor.
public enum MyEnum {
    FOO_BAR ("fooBar"), BAZ_QUUX ("bazQuux");

    private final String varName;
    private MyEnum(String varName) {
        this.varName = varName();
    }
    public String varName() {
        return varName();
    }
}

name() metodunu kullanmak
Bir başka örnekte ise Enum sınıfı ile gelen name() metodu kullanılıyor.

enum LOAN {
    HOME_LOAN,AUTO_LOAN
}
String autoLoan = LOAN.AUTO_LOAN.name();//Çıktı olarak AUTO_LOAN verir
C#
Enumeration yazısına taşıdım.

Enum'a atanan anotasyonu String'e Çevirmek
C# 
Enumeration yazısına taşıdım.

Enum'u Kalıtmak
Java
Java'da enum final olduğu için kendisinden kalıtılınamaz. Ancak enum bir arayüzden kalıtabilir.
private enum EntryComp implements Comparator<Multiset.Entry<?>>{..}
Kalıtım durumda metodlarda @Override ile başlayan anotasyonlar yerleştirilir.
public enum MyEnum implements Command {

    FORWARD("qwersadd", new String[] { "fd", "forward" }),
    PENUP("vcvzxcvz", new String[] { "pu", "penup" });

    private final String description;
    private final String[] aliases;

    private MyEnum(String description, String[] aliases) {
        this.description = description;
        this.aliases = aliases;
    }

    @Override
    public boolean isCommand(String command) {
        ...
    }
}

C++
Enumeration yazısına taşıdım.

C#
Enumeration yazısına taşıdım.

Enum ve Atanan Değer
Enum'a atanan değer derleme zamanında bilinen bir sabit değer olmalı (compile time constant)
C#
Enumeration yazısına taşıdım.

C++
Enumeration yazısına taşıdım.





Hiç yorum yok:

Yorum Gönder