Почему в коллекциях Java есть помощники для 0 или 1, но не больше элементов? - PullRequest
2 голосов
/ 04 ноября 2010

Если я хочу пустую карту или карту с одним элементом, у Java Collections есть метод для этого. Почему нет метода для более чем одного элемента? Какой лучший способ создать статическую итоговую карту с двумя элементами в ней? Я знаю, что могу сделать что-то вроде:

private static final Map<String, String> MAP = new HashMap<String, String>() {
    { put("a", "b"); put("c", "d"); }
};

Но тогда Eclipse жалуется на serialVersionUID ...

Ответы [ 5 ]

16 голосов
/ 04 ноября 2010

Причина, по которой Collections имеет методы для карт ввода 0 и 1, заключается в том, что они являются особыми случаями ... например, пустой Map является неизменяемым синглтоном.

Для того, что вы хотите сделать,тем не менее, я бы настоятельно рекомендовал использовать Guava .Его Immutable* коллекций (особенно ImmutableMap) - это то, что вы хотите, я думаю:

private static final ImmutableMap<String, String> MAP = ImmutableMap.of(
    "a", "b",
    "c", "d");

Вы можете сделать выше для маленьких карт, а для больших карт вы можете написать:

private static final ImmutableMap<String, String> MAP = 
    ImmutableMap.<String, String>builder()
      .put("a", "b")
      .put("b", "c")
      ...
      .put("y", "z")
      .build();

Если вы не используете Гуаву, вы все равно, вероятно, захотите убедиться, что эту карту нельзя изменить.Это намного страшнее:

private static final Map<String, String> MAP;

static {
  Map<String, String> temp = new HashMap<String, String>();
  temp.put("a", "b");
  temp.put("b", "c");
  MAP = Collections.unmodifiableMap(temp);
}
2 голосов
/ 04 ноября 2010

Изменяемые объекты, такие как карты, могут быть изменены, даже если они статичны и окончательны.Финал просто означает, что ссылка на объект не может измениться.Вам не нужно добавлять объекты при инициализации.Карту можно добавлять и иным образом изменять в других областях кода, но нельзя назначить другой объект переменной MAP позднее.

Если вы хотите, чтобы она была инициализирована двумя элементами, вы можетедобавьте их в статический блок после объявления.

static { 
   MAP.put("a", "b"); 
   MAP.put("c", "d");
}

Эта статья содержит полезную информацию о том, как работают статические блоки.

Если вы хотите неизменную карту сдва элемента, вы можете снова использовать статический блок, например:

private static final Map<String, String> MAP;
static {
    Map<String, String> tempMap = new HashMap<String, String>();
    tempMap.put("a", "b");
    tempMap.put("c", "d");
    MAP = Collections.unmodifiableMap(tempMap);
}
1 голос
/ 04 ноября 2010

Попробуйте (измененная версия написанного Марком Сторером):

private static final Map<String, String> Map = buildMap();

private static Map<String, String> buildMap() {
  Map<String, String> map = new HashMap<String, String>();
  map.put("a", "b");
  map.put("c", "d");
  return Collections.unmodifiableMap(map);
}
0 голосов
/ 05 ноября 2010

Если они предоставляют 0..N для любого N, вы спросите, почему не поддерживается N + 1 N = 0 и N = 1 легко обрабатываются в особых случаях.

0 голосов
/ 04 ноября 2010

Использовать возвращаемое значение статической функции:

private static final Map<String, String> Map = buildMap();

private static Map<String, String> buildMap() {
  Map<String, String> map = new HashMap<String, String>();
  map.put("a", "b");
  map.put("c", "d");
  return map;
}

РЕДАКТИРОВАТЬ: Нет. Мое C / C ++ "const" мышление показывает. Окончательная переменная может быть назначена только один раз, но объект, назначенный этой переменной, все еще довольно изменчив

...