Какой способ инициализации списка лучше - PullRequest
7 голосов
/ 03 февраля 2010

Мне было интересно, какой способ инициализации списка лучше?


public class Main {
    private final List<String> l = new ArrayList<String>();

    {
        l.add("a");
        l.add("b");
        l.add("c");
    }
}

public class Main {

    private final List<String> l = new ArrayList<String>() {{
        l.add("a");
        l.add("b");
        l.add("c");        
    }};
}

Ответы [ 3 ]

6 голосов
/ 03 февраля 2010

Я предпочитаю использовать статические фабричные методы следующего вида:

public final class CollectionUtils {
    private CollectionUtils() {  
    }

    public static <T> List<T> list(T... data) {
        return Arrays.asList(data);
    }

    public static <T> ArrayList<T> newArrayList() {
        return new ArrayList<T>();
    }

    public static <T> ArrayList<T> newArrayList(T... data) {
        return new ArrayList<T>(list(data));
    }
}

Итак, вы можете использовать их в своем коде следующим образом:

import static CollectionUtils.list;
import static CollectionUtils.newArrayList;

public class Main {
    private final List<String> l1 = list("a", "b", "c");
    private final List<String> l2 = newArrayList("a", "b", "c");
}

Таким образом, вы получаете относительно компактный способ создания и заполнения списков и вам не нужно дублировать общие объявления. Обратите внимание, что метод list просто создает представление списка массива. Вы не можете добавить элементы к нему позже (или удалить). Между тем newArrayList создает обычный ArrayList объект.

Как заметил Йоахим Зауэр , эти служебные методы (и многие другие полезные вещи) можно найти в библиотеке Google Collections (которая теперь является частью Guava проект).

4 голосов
/ 03 февраля 2010

первый, поскольку он не создает анонимный класс; проверьте причины здесь

2 голосов
/ 03 февраля 2010

Ни один, потому что никто не делает список неизменным. Я думаю, вы хотите сделать его неизменным, когда вы используете final. Если это не так, я прошу прощения за свое предположение.

Если я правильно понял, вы должны взглянуть на Collections.unmodifiableList(). И последний пригодится,

private final List<String> l = Collections.unmodifiableList(new ArrayList<String>() {{
        add("a");
        add("b");
        add("c");        
}});

В противном случае, dfa правильно предложит первое.

Другим способом может быть это,

private final List<String> l = Collections.unmodifiableList(Arrays.asList("a", 
                                    "b", "c"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...