statyczne metody fabryki zwracające stałą wyliczeniową na podstawie wartości pola instancji przyjmują jedną z dwóch form opisanych w innych odpowiedziach: rozwiązanie oparte na i z wartości wyliczeniowych lub rozwiązania opartego na HashMap
.
W przypadku wartości wyliczeniowych z małą liczbą stałych, rozwiązanie iteracyjne powinno być tak samo wydajne jak rozwiązanie HashMap
(które wymaga obliczenia kodu skrótu, dopasowania go do zasobnika i założenia, że nie będzie kolizji mieszania).
W przypadku większych wyliczeń rozwiązanie oparte na mapie będzie bardziej wydajne (ale wymaga pamięci w pamięci). Jednakże, jeśli metoda fabryczna jest rzadko wywoływana, ogólna poprawa wydajności przy użyciu mapy może wciąż być niezmiernie mała.
Ogólna decyzja o zastosowaniu wyszukiwania iteracyjnego lub wyszukiwania na podstawie mapy dla statycznej metody fabryki ostatecznie zależy od wymagań i środowiska. Nigdy nie jest źle, aby zacząć od iteracyjnego wyszukiwania, a następnie przejść do wdrożenia opartej na mapie, jeśli profilowanie pokazuje rzeczywisty problem z wydajnością.
Wreszcie, od czasu Java 8, API Streams
umożliwia oparte na potoku rozwiązanie do mapowania (które powinno mieć wydajność podobną do rozwiązania iteracyjnego). Załóżmy na przykład, że chcesz utworzyć interfejs, którego można użyć na dowolnej klasie wyliczeniowej, aby wyrazić zamiar, że powinien być możliwy do dopasowania przez jedno z jego pól instancji. Nazwijmy ten interfejs Matchable
. Ten interfejs definiuje metodę, która zwraca pole instancji, które chcesz dopasować (np. getField()
). Interfejs ten może również zdefiniować statyczną metodę fabryczną powrót stały z dowolnego wykonawczego klasy ENUM:
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()));
}
}
Teraz dowolnej klasy enum, które określają, że realizuje Matchable
można używać Matchable.forToken()
statycznej metody fabryki na znalezienie stałej enum którego wartość pola instancji jest zgodna z podanym parametrem.
Ogólna deklaracja typu E extends Enum<E> & Matchable
zapewnia, że token typu przekazywany do metody jako parametr będzie dotyczył klasy enum implementującej Matchable
(w przeciwnym razie kod nie zostanie skompilowany).
toString() da ci reprezentację łańcuchową Enum, chyba że ją przesłonisz. – Marvo
@Jethro fyi, tak naprawdę nie "inicjujesz nowego wyliczenia" za pomocą tego przykładowego kodu. W rzeczywistości nie można tego zrobić, ponieważ wyliczenia w Javie są efektywnymi singletonami. Naprawdę szukasz aktualnej wartości wyliczeniowej. – sharakan