Скажем, у меня есть перечисление со 100 значениями. Для простоты сделайте следующий пример:
public enum code
{
CODE_1("string1"),
CODE_2("string2"),
CODE_3("string3"),
CODE_4("string4"),
...
}
Я хочу создать общедоступный метод для преобразования строк с известным форматом (например, "string1", "string2"...) в соответствующее значение перечисления CODE_1, CODE_2... Обычно это выполняется путем итерации по всем значениям, и если совпадение найдено, верните это значение перечисления. (Подробности можно найти в этом вопросе.)
Тем не менее, я обеспокоен циклом reguraly по всем значениям. Может ли это быть огромным узким местом? Что, если вместо 100 элементов было 1000?
В качестве упражнения для себя я попытался оптимизировать этот поиск со статической картой, которая может гарантировать время поиска O (1), заданное любой строкой. Мне нравится этот дополнительный трюк, но я хочу включить его в свой код, если это действительно необходимо. Каковы ваши мысли и выводы об использовании метода итерации против метода карты?
public enum Code
{
...
//enum values
...
//The string-to-Code map
private static final Map<String,Code> CODE_MAP = populateMap();
private static Map<String,Code> populateMap()
{
Map<String,Code> map = new HashMap<String,Code>();
for(Code c : Code.values())
{
map.put(c.getCode(), c);
}
return map;
}
private String code;
private Code(String code)
{
this.code = code;
}
public String getCode()
{
return this.code;
}
public Code convertFromString(String code)
{
//assume that the given string is actually a key value in the map
return (Code) CODE_MAP.get(code);
}
}