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.
[…] Madde 35’de çoğu programcının enum türleri için tanımlanan ordinal metoduna ihtiyacı olmayacağını ve bu sebeple de çok nadir durumlar haricinde kullanılmaması gerektiğini söylemiştik. Bu maddede ise bazı programcıların ordinal kullanmayı tercih ettiği bir iki özel durum üzerinde duracağız. […]