哪种列表初始化方式更好

时间:2010-02-03 07:29:59

标签: java

我想知道,列表的初始化哪种方式更好?


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 个答案:

答案 0 :(得分:6)

我更喜欢使用下一种静态工厂方法:

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对象。

正如Joachim Sauer所指出的,这些实用程序方法(以及许多其他有用的东西)都可以在Google Collections库中找到(它现在是Guava项目的一部分)。

答案 1 :(得分:4)

前者,因为它不会创建匿名类; check the reasons here

答案 2 :(得分:2)

两者都没有,因为没有一个使列表不可变。当你使用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"));