Press "Enter" to skip to content

Effective Java Madde 35: Ordinal Yerine Nesne Alanları Kullanın

Bütün enumlar ordinal adında bir metot içerirler. Bu metot enum sabitinin enum türü içinde tanımlandığı pozisyonu döndürür. Örnek olarak aşağıdaki enum türüne bakalım:

enum Colors {  
    RED, BLACK, GREEN, BLUE;  
}

Bu enum için ordinal değerlerine bakacak olursak:

public static void main(String[] args) {
    System.out.println(" Red ordinal = " + Colors.RED.ordinal());
    System.out.println(" Black ordinal = " + Colors.BLACK.ordinal());
    System.out.println(" Green ordinal = " + Colors.GREEN.ordinal());
    System.out.println(" Blue ordinal = " + Colors.BLUE.ordinal());
}

Kodun çıktısı aşağıdaki gibi olacaktır. Enumda ilk tanımlanan RED sabiti 0 değerini alırken sonrakiler de birer birer artarak ilerleyen sıra numaları alırlar:

Red ordinal = 0
Black ordinal = 1
Green ordinal = 2
Blue ordinal = 3

ordinal metodunun bu çalışma prensibinden faydalanmak için aşağıdaki gibi kullanımlar aklınıza gelebilir:

// orbital metodundan faydalanarak int değerleri türetme
// BUNU YAPMAYIN!! 
public enum Ensemble {
    SOLO,   DUET,   TRIO, QUARTET, QUINTET,
    SEXTET, SEPTET, OCTET, NONET,  DECTET;

    public int numberOfMusicians() { 
        return ordinal() + 1; 
    } 
}

Bu enumda koro türlerini temsil eden enum sabitlerinin kaç müzisyenden oluştuğu bilgisi numberOfMusicians metodu tarafından döndürülmektedir. Bu enum çalışır vaziyette olsa da bakımı kabus gibidir. Eğer enum sabitlerinin sırası değişirse numberOfMusicians metodu bozulacaktır. Aynı int değerine sahip olması gereken başka bir sabit eklemek mümkün değildir. Örneğin, OCTET gibi 8 müzisyenden oluşan bir DOUBLE_QUARTET sabiti eklemek isterseniz bunu yapmanın bir yolu yoktur.

Başka bir problem de örneğin 12 müzisyenden oluşan TRIPLE_QUARTET eklemek isterseniz çıkar. Yukarıda 1 ve 10 arası müzisyenden oluşan koro türlerini tanımlamıştık. Arada 11 olmadan 12 elemanlı koroyu nasıl tanımlayacağız? Bunun için de 11 değerini temsilen işlevsiz bir eleman eklemeniz gerekecektir. En hafif tabiriyle çirkin diyebileceğimiz bu durum eğer çok sayıda int sabiti işlevsiz durumda kalıyorsa tamamen kontrolden çıkacaktır.

Neyse ki bunun çok basit bir çözümü var. Ordinal kullanarak asla bir int değeri türetmeyin. Bunun yerine int türünde bir nesne alanı tanımlayıp onu kullanın.

public enum Ensemble {
    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
    SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
    NONET(9), DECTET(10), TRIPLE_QUARTET(12);

    private final int numberOfMusicians;
    Ensemble(int size) { 
        this.numberOfMusicians = size; 
    } 

    public int numberOfMusicians() { 
        return numberOfMusicians; 
    }
}

Enum dokümantasyonu ordinal metodu hakkında şunu söyler: “Çoğu programcının bu metoda ihtiyacı olmaz. EnumSet ve EnumMap gibi enum tabanlı veri yapılarında kullanılmak üzere tasarlanmıştır.” Siz de buna benzer bir amaçla kod yazmadığınız sürece ordinal metodundan tamamıyla kaçınmak en doğrusu olacaktır.

Share

One Comment

Leave a Reply

%d bloggers like this: