我想知道,列表的初始化哪种方式更好?
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");
}};
}
答案 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"));