Обратный поиск для Java Enums с более чем одним значением на ключ / константу?
С таким перечислением, где каждый ключ имеет несколько значений
ABBR1("long text 1", "another description 1", "yet another one 1"),
ABBR2("long text 2", "another description 2", "yet another one 2"),
//and so on...
Как я могу отменить поиск аббревиатуру (константу), вызвав метод, как getAbbreviation(descriptionText)
?
Я в основном ищу реализацию, как описано здесь, я думаю, но с той разницей, что каждый ключ ENUM (константа) имеет несколько значений, и я хочу, чтобы он работал с getAbbreviation("long text 1")
а также с getAbbreviation("yet another one 2")
...
Есть ли простой способ зацикливаться на каждом ENUM (т.е. ABBRn
s) поля значений, чтобы заполнить гигантскую карту, или, может быть, есть даже лучшее решение?
3 ответа
Это зависит от того факта, что конструкторы-члены enum запускаются перед статическим инициализатором. Затем инициализатор кэширует элементы и их длинные формы.
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public enum Abbreviation {
ABBR1("long text 1", "another description 1", "yet another one 1"),
ABBR2("long text 2", "another description 2", "yet another one 2");
private static final Map<String, Abbreviation> ABBREVIATIONS = new HashMap<>();
private String[] longForms;
private Abbreviation(String... longForms) {
this.longForms = longForms;
}
public String toString () {
return Arrays.toString(longForms);
}
static {
for(Abbreviation abbr : values()) {
for(String longForm : abbr.longForms) {
ABBREVIATIONS.put(longForm, abbr);
}
}
}
public static Abbreviation of(String longForm) {
Abbreviation abbreviation = ABBREVIATIONS.get(longForm);
if(abbreviation == null) throw new IllegalArgumentException(longForm + " cannot be abbreviated");
return abbreviation;
}
public static void main(String[] args) {
Abbreviation a = Abbreviation.of("yet another one 2");
System.out.println(a == Abbreviation.ABBR2); //true
}
}
Каждое перечисление имеет метод values (), так что вы можете сделать так:
for(YourEnum type : values()){
if(/*is Equal to Your descriptionText*/){
return type;
}
}
throw new IllegalArgumentException("No such BailiffPaymentStatus:"+dbRepresentation);
Я думаю, что решение от: cPu1 находится на правильном пути. Однако существует более прямой способ заполнения HashMap по мере использования решения из этого вопроса.
private static final Map<String, Abbreviation> abbreviationMap; private Abbreviation(String... longForms) { this.longForms = longForms; // optional mapAbbreviations( this, longForms ) } private static void mapAbbreviations( final Status state, String... longForms ){ if( null == abbreviationMap ){ abbreviationMap = new HashMap( 20 ); } for( String abbrev : longForms ){ abbreviationMap.put( abbrev, state ); } }
Кроме того, вам не нужен частный longForms
строковый массив для функции toString(), так как все значения в любом случае сохраняются в Map.