2010-02-03 68 views
7

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


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");   
    }}; 
} 

+2

后期工作,但你不必在身体使用'l.'-前缀。简单的'add(“a”);'就够了。 – Ahe 2010-02-03 07:36:40

回答

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")); 
+0

第二个例子是final的,所以我可以在我假设的匿名块内访问'l'。这是错误的,因为你不需要它,你可以只写'add(“a”)'而不是'l.add(“a”)',但我认为这是原因而不是伪不可变性。 – cletus 2010-02-03 07:37:05

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"); 
} 

因此,您得到了比较紧凑的创建和填充列表的方式,并且不需要重复通用的de clarations。请注意,list方法只是创建数组的列表视图。您不能在稍后添加元素(或删除)。同时newArrayList创建通常的ArrayList对象。

由于Joachim Sauer指出,这些实用方法(和许多其他有用的东西)可以在Google Collections库(现在是Guava项目的一部分)中找到。

+1

我必须为此投票,因为这是我在多个项目中使用的方法。但是,我认为你忘记了'Main'示例中的静态导入:) – Christoffer 2010-02-03 08:14:48

+0

IDE通常会为我添加它们) – Rorick 2010-02-03 08:19:44

+2

Google Collections会为您执行此操作(以及很多其他操作)。例如,这些工厂方法在'Lists'类中。 – 2010-02-03 08:31:15