Альтернатива двойной инициализации

У меня есть вложенная коллекция в виде:

HashMap<String, HashMap<String, List<String>>> errorList;

Теперь я инициализирую его, используя двойные скобки, как это

errorList.put(tempName, new HashMap<String, List<String>>() {{
    put("upl", new ArrayList<String>() {{ add("Y"); add("Upload Success"); }});
}});

Это лежит в цикле foreach со значением tempName меняется в каждой итерации. Я сделал это, потому что я не мог использовать экземпляры List<String> или же HashMap<String,List<String>> потому что каждый раз, когда я изменял значение в этом экземпляре, оно отражается в коллекции, в которую он вложен. Поэтому я вынужден создавать новые экземпляры с двойной инициализацией скобок.

Дело в том, что я хочу использовать список объектов. Вместо

new ArrayList<String>() {{ add("Y"); add("Upload Success"); }}

Я хочу использовать переменную.

Как я могу это сделать?

1 ответ

Решение

Вместо

new ArrayList<String>() {{ add("Y"); add("Upload Success"); }}

вы можете использовать

Arrays.asList("Y", "Upload Success")

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

new ArrayList<>(Arrays.asList("Y", "Upload Success"))

И, конечно, вы можете поместить этот список в его собственную переменную, прежде чем поместить его в структуру вашей карты.

Если вы хотите поставить либо [Y, Upload Success] или же [N, Upload Failed] и убедитесь, что списки не разделены между записями на карте, вот предложение: во-первых, вне цикла:

final List<String> successList = Arrays.asList("Y", "Upload Success");
final List<String> failureList = Arrays.asList("N", "Upload Failed");

Тогда внутри вашей петли

if (wasSuccessful) {
    errorList.put(tempName,
                  Collections.singletonMap("upl", new ArrayList<>(successList)));
} else {
    errorList.put(tempName,
                  Collections.singletonMap("upl", new ArrayList<>(failureList)));
}

Вы можете сделать эту идею еще на шаг дальше и построить карты вне цикла. И снова, если вы хотите, чтобы внутренняя карта была HashMap, просто преобразовать в один: new HashMap<>(Collections.singletonMap("upl", new ArrayList<>(successList))),

Я не проверял код, надеюсь, вы можете исправить, если есть опечатка.

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

Другие вопросы по тегам