Каковы недостатки использования инициализаторов коллекций на месте в Java? - PullRequest
1 голос
/ 12 июля 2011

Рассмотрим этот кусок кода:

Set<String> mySet = new HashSet<String>(){{add("foo");add("boo");}};

или для HashMap:

Map<String,String> myMap = new HashMap<String,String>(){{put("foo","bar");put("boo","jar");}};

Плюсы просто найти: меньше строк кода, краткость. Но каковы минусы?

UPD : Вопрос касается не только наборов, но и всех типов коллекций, добавлен Map для иллюстрации этого.

Ответы [ 5 ]

16 голосов
/ 12 июля 2011

Когда вы делаете это, вы создаете анонимный подкласс HashSet, что означает, что вы без необходимости загрязняете свою кодовую базу классами, которые не делают ничего нового.

Как насчет этого?

Set<String> set = new HashSet<String>(Arrays.asList("foo", "bar"));

Или, альтернативно, используйте класс Гуава * Sets. У него есть фабричные методы для инициализации различных видов наборов:

Set<String> set = Sets.newHashSet("foo", "bar");

С Картами это сложнее, но вы можете использовать ImmutableMap:

Map<String,String> myMap = 
    ImmutableMap.of("foo","bar","boo","jar");

или (изменяемая версия)

Map<String,String> myMutableMap =
        Maps.newHashMap(ImmutableMap.of("foo","bar","boo","jar"));

Без внешних библиотек вы все равно можете инициализировать карту с одной записью:

Map<String,String> myMap = new HashMap<String, String>(
    Collections.singleTonMap("foo","bar")
);

но это будет один уродливый зверь, если вы спросите меня.


UPD: вопрос не только в множествах, но и во всех типах коллекции, добавлена ​​карта, чтобы проиллюстрировать это.

Гуава имеет несколько Фабричных классов, таких как:

Sets, Maps, Lists, Multimaps, Multisets, Ranges

3 голосов
/ 12 июля 2011

Con: Это приведет к анонимному классу, который должен быть загружен загрузчиком классов.Если вы сделаете это 500 000 раз, я уверен, что вы столкнетесь с OutOfMemoryExceptions

2 голосов
/ 12 июля 2011

Сложно читать таким образом, особенно с {{и}}.

1 голос
/ 12 июля 2011

Мне кажется, мне легче читать, но это совершенно не по вкусу.

Основной минус - это когда equals() для класса делает

if (getClass() != ThisClass.class) return false;

Анонимный класс является подклассом и может нарушать метод equals() в зависимости от того, как он был реализован.

0 голосов
/ 18 октября 2014

Они больше не работают с gson.

Gson gson = new Gson();
Map<String, Object> m;

m = new HashMap<String, Object>(){{ put("a", "b"); }};
System.out.println(gson.toJson(m)); // null


m = new HashMap<String, Object>();
m.put("a", "b");
System.out.println(gson.toJson(m)); // {"a":"b"}
...