Компактный синтаксис для создания инициализирующей коллекции

Я ищу компактный синтаксис для создания экземпляра коллекции и добавления нескольких элементов к ней. В настоящее время я использую этот синтаксис:

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" }));

Мне кажется, что существует более компактный способ сделать это, который использует анонимный подкласс ArrayList, а затем добавляет элементы в конструкторе подкласса. Тем не менее, я не могу вспомнить точный синтаксис.

Ответы

Ответ 2

Думаю, вы думаете о

collection = new ArrayList<String>() { // anonymous subclass
     { // anonymous initializer
         add("1");
         add("2");
         add("3");
     }
}

который, скомпонованный, дает

collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}

ЧУВСТВИТЕЛЬНО, мягко говоря. Однако существует вариант метода Arrays.asList: Arrays.asList(T...a), который обеспечивает компромисс и читаемость. В качестве примера он дает следующую строку кода:

collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter

И обратите внимание, что вы не создаете анонимный подкласс ArrayList для сомнительного использования.

Ответ 3

Возможно, это был

Collection<String> collection = new ArrayList<String>() {{
    add("foo");
    add("bar");
}};

Также известен как инициализация с двойной скобкой.

Ответ 4

Вы можете создать служебную функцию:

@SafeVarargs
public static <T> List<T> listOf(T ... values) {
    return new ArrayList<T>(Arrays.asList(values));
}

Итак, вы можете называть его так:

collection = MyUtils.listOf("1", "2", "3");

Таким образом, вы можете легко заполнить список и по-прежнему не изменять его.

Ответ 6

Возможно, это только я, но я не вижу смысла усложнять вещи, просто в поисках более короткого/быстрого кода. Учитывая выбор печатать меньше строк кода и намного легче отлаживать/пересматривать, я уверен, что я выберу второй вариант.

Таким образом, если нет конкретной причины настаивать на том, чтобы сохранить это короткое, я бы сказал, что придерживаюсь бритвы Оккама, и, учитывая ряд решений проблемы, переходите к самому простому. Таким образом, когда что-то пойдет не так (что закон Мерфи явно диктует его), вам будет намного легче отслеживать его.:)