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

Latter는 작동하지만 본문에는'l.'-prefix를 사용할 필요가 없습니다. 일반'add ("a");는 충분합니다. – Ahe

답변

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'이 접근 할 수 있습니다. 당신이 그것을 필요로하지 않고'l.add ("a") 대신'add ("a")'를 쓸 수 있기 때문에 그건 잘못된 것입니다. 그러나 이것이 의사 불변 성 이라기보다는 이유라고 생각합니다. – cletus

6

나는 다음 종류의 static 팩토리 메소드 사용을 선호 :

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

여러 프로젝트에서 사용한 접근 방법이므로이 투표를해야합니다. 그러나 '메인'예에서 정적 가져 오기를 잊어 버린 것 같습니다. – Christoffer

+0

IDE에서 대개 나를 추가합니다. – Rorick

+2

Google 컬렉션은이 작업을 비롯한 여러 가지 작업을 수행합니다. 이러한 팩토리 메소드는 예를 들어'Lists' 클래스에 있습니다. –

관련 문제