Лучше использовать одну карту с пользовательским объектом в качестве значения или несколько карт с уникальным «примитивным» значением?

#java #hashmap #inner-classes

#java #hashmap #внутренние классы

Вопрос:

Я рассматриваю возможность рефакторинга некоторого фрагмента кода, на который я наткнулся, и мне было интересно, стоит ли оно того. Вот что у меня есть: несколько карт, которые принимают перечисление в качестве ключа и либо строку, либо класс в качестве значения.

 private static final Map<MyEnum, String> FIELD_MAP = new HashMap<MyEnum, String>();
private static final Map<MyEnum, String> ALIAS_MAP = new HashMap<MyEnum, String>();
private static final Map<MyEnum, Class> CLASS_MAP = new HashMap<MyEnum, Class>();
  

Более того, все эти карты «статически» инициализируются статическими блоками следующим образом.

 static
{
    FIELD_MAP.put(MyEnum.VALUE1, "BLOP.ONE");
    FIELD_MAP.put(MyEnum.VALUE2, "BLOP.TWO");
    FIELD_MAP.put(MyEnum.VALUE3, "BLOP.THREE");
}

static
{
    ALIAS_MAP.put(MyEnum.VALUE1, "ONE");
    ALIAS_MAP.put(MyEnum.VALUE2, "TWO");
    ALIAS_MAP.put(MyEnum.VALUE3, "THREE");
}

static
{
    CLASS_MAP.put(MyEnum.VALUE1, String.class);
    CLASS_MAP.put(MyEnum.VALUE2, Integer.class);
    CLASS_MAP.put(MyEnum.VALUE3, Double.class);
}
  

Но всегда одинаково, т. Е. У меня есть карта для имен полей, карта для имен псевдонимов и карта для классов. Я думал использовать конкретный объект, содержащий все три поля, чтобы объединить три карты в одну, которая будет выглядеть так :

 private static final Map<MyEnum, MyClass> FOREVER_ALONE;
  

Пользовательский класс будет статическим вложенным классом — потому что он будет использоваться только для этой цели — вот так:

 static class MyClass
{
    public String mField;
    public String mAlias;
    public Class mClass;

    /**
     * Actually, all fields are required.
     * So no default empty constructor.
     */
    MyClass(String pField, String pAlias, String pClass){...}
}
  

Но перед этим я хотел бы знать, действительно ли это актуально или я просто трачу время на выполнение чего-то эквивалентного? Есть ли разница в производительности между этими двумя решениями (существующим и тем, которое я хочу разработать)?
Фактический внешний класс имеет длину почти 1 600 строк, поэтому многие, многие, многие карты могут быть объединены…

Комментарии:

1. Использование группировки классов для связанной информации было бы намного чище и, вероятно, было бы незначительно более эффективным, поскольку вам потребуется один поиск по карте, чтобы получить все значения сразу, а не 3 поиска по карте.

2. Рассмотрите возможность использования EnumMap . Также рассмотрите возможность объединения значений карты непосредственно в константы перечисления. Типы перечислений могут иметь методы и поля, и кажется, что эти карты содержат данные, которые тесно связаны с каждой константой перечисления. Если это так, данные выглядят так, как будто они принадлежат непосредственно перечислению.

3. @StuartMarks Да, конечно, это так. Теперь я заметил, что забыл упомянуть, что используемые перечисления — они генерируются из файлов XSD… Так что в этом смысле настройка невозможна. = (В противном случае вы заставили меня открыть EnumMap, который я не знал. =)