, burada bir HashMap ile alternatif bir çözümdür örnek alanın değerine bağlı olarak bir enum sabitini döndüren diğer yanıtlarda açıklanan iki formdan birini alır: enum değerlerini ya da HashMap
temel alınarak çözüm.
Az sayıda sabiti olan enumlar için, yinelemeli çözüm, HashMap
çözümüyle (karma kodun hesaplanmasını, bir kovayla eşleştirilmesini ve karma çarpışmaların olmayacağını varsayarak) performans kadar iyi olmalıdır.
Daha büyük enumlar için, harita tabanlı çözüm daha performanslı olacaktır (ancak bellekte depolama alanı gerektirir). Ancak, fabrika yöntemi nadiren çağrılırsa, bir harita kullanarak genel performans iyileştirmesi hala ölçülemez şekilde küçük olabilir.
Yinelemeli bir arama veya statik fabrika yöntemi için harita tabanlı bir arama kullanma kararı genel olarak gereksinimlerinize ve ortama bağlı olacaktır. Yinelemeli bir arama ile başlamak ve profil oluşturma gerçek bir performans sorunu gösterirse harita tabanlı bir uygulamaya geçmek asla yanlış olmaz. Son olarak, Java 8'den beri, Streams
API, haritalama için boru hattı tabanlı bir çözüm sağlar (bu, yinelemeli çözüme benzer bir performansa sahip olmalıdır). Örneğin, herhangi bir enum sınıfında kullanabileceğiniz, örnek alanlarından biriyle eşleşmesi gerektiğini belirten bir arabirim oluşturmak istediğinizi varsayalım. Bu arayüze Matchable
diyelim. Bu arabirim, eşleştirmek istediğiniz örnek alanını döndüren bir yöntemi tanımlar (ör. getField()
). Ayrıca statik fabrika yöntemini tanımlayabilirsiniz Bu arayüz herhangi uygulayan enum sınıfından sabit dönmek için:
interface Matchable {
Object getField();
public static <E extends Enum<E> & Matchable> E forToken(Class<E> cls, Object token) {
return Stream.of(cls.getEnumConstants())
.filter(e -> e.getField().equals(token))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Unknown token '" +
token + "' for enum " + cls.getName()));
}
}
Şimdi, herhangi bir enum sınıfı o Matchable
kimin enum sabiti bulmak için Matchable.forToken()
statik fabrika yöntemi kullanabilirsiniz uygulayan tanımlamak o örnek alan değeri verilen parametreyle eşleşir.
Genel tip bildirimi E extends Enum<E> & Matchable
, belirtecin yönteme bir parametre olarak aktarılmasının, Matchable
uygulayan bir enum sınıfı için olacağını garanti eder (aksi halde kod derlenmez).
toString(), siz onu geçersiz kılmadığınız sürece Enum'un bir String temsilini verecektir. – Marvo
@Jethro fyi, bu örnek kodla gerçekten 'yeni bir numarayı başlat' değilsiniz. Aslında bunu yapamazsınız çünkü Java'daki enumlar etkili bir şekilde bekardır. Gerçekten mevcut bir enum değerine bakıyorsunuz. – sharakan