2010-02-03 71 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