Альтернатива двойной инициализации
У меня есть вложенная коллекция в виде:
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)))
,
Я не проверял код, надеюсь, вы можете исправить, если есть опечатка.
Вы заметили, что я полностью избежал инициализации двойной скобки. Несмотря на то, что он краткий, он имеет издержки как концептуально, так и в плане производительности. Вы создаете новый анонимный подкласс каждый раз, что я не считаю оправданным.