Java Enum Reverse Lookup
Java 1.5 sürümü ile birlikte gelen Enum sınıfı genel itibariyle sabit verileri tanımlamak için kullanılır. 1.5 öncesi static final olarak tanımlanan sabit verilere denk gelir bir nevi. ÇoÄŸu zaman da bu sabit verilerle iliÅŸkilendirilmiÅŸ bir kod eÅŸlemesi yapılır. Döviz-döviz kodu, elemen-element simgesi, durum-durum kodu gibi…Bu kod tanımı Enum sınıfın yapılandırıcısına parametre geçilerek yapılır.
public enum Gender { Male("M"), Female("F"); private String code; private Gender(String code) { this.code = code; } public String getCode() { return code; } }
Herhangi bir enum değerin code alanına
Gender.Male.getCode()
ÅŸeklinde eriÅŸebiliriz.
Bahsetmek istediÄŸim ise bunun tam tersi durumda yani code alanından enum deÄŸere eriÅŸmek istediÄŸimiz durumda ne yapılabileceÄŸi. Bu durumun tam karşılığı “enum reverse lookup”.
public enum Month { JAN(1),FEB(2),MAR(3),APRIL(4),MAY(5),JUN(6),JUL(7),AUG(8),SEP(9),OCT(10),NOV(11),DEC(12); private int code; private Month(int code) { this.code = code; } public int getCode() { return code; } }
şeklinde bir enum sınıfı olduğunu varsayarsak code alanından Month enum değerine
public Month getMonthFromCode(int code){ for (Month month : Month.values()){ if (month.getCode() == code) return month; } return null;
ÅŸeklinde eriÅŸilebilir.
Fakat her seferinde bir for döngüsü ile enum deÄŸerleri içinde dönmek yerine static bir Map tanımlayıp, bütün enum deÄŸeri-kod eÅŸleÅŸmeleri bu Map‘e koyularak, istenen enum deÄŸere her seferinde tek hamlede de eriÅŸlebilir. Şöyle ki;
public enum Month { JANARY(1),FEBRUARY(2),MARCH(3),APRIL(4),MAY(5),JUNE(6),JULY(7),AUGUST(8),SEPTEMBER(9),OCTOBER(10),NOVEMBER(11),DECEMBER(12); private int code; private static Map enumCodeMap; static { enumCodeMap = new HashMap(); for(Month month : Month.values()){ enumCodeMap.put(month.getCode(), month); } } public static Month getMonthFromCode(int code){ return enumCodeMap.get(code); } private Month(int code) { this.code = code; } public int getCode() { return code; } }
şeklindeki bir enum tanımı sonrası
Month month = Month.getMonthFromCode(6); //JUNE
denilebilir. Bu şekilde static bir tanım ile JVM, Month enum sınıfını yüklediğinde hazır hale gelmiş olan enumCodeMap değişkeni üzerinden her seferinde teknik olarak da, kod satırı olarak da tek hamle ile istenen enum değere erişilmiş olur.
Düzenleme : Bu durumla tam olarak örtüşen bir örnek, periyodik cetveldeki elementlerin tutulduÄŸu bir enum sınıfı olabilir. Element adı enum deÄŸeri, element simgesi kod olacak ÅŸekilde oluÅŸturulmuÅŸ olan bir Element enum sınıfı düşünülebilir. Altın’ın simgesi olan “Au” ya eriÅŸmekten ziyade, simgesi “Au” olan elemente eriÅŸmek lazım olduÄŸu durumlarda bu yöntem kullanılabilir
Son Yorumlar