2010-02-03 17 views
7

Bir listenin hangi şekilde başlatılmasının daha iyi olduğunu merak ediyordum? o isimsiz sınıf oluşturmak olmadığındanListe Hangi Şekilde Daha İyi


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

Sonuncu çalışır, ancak vücutta 'l.'-öneki kullanmak zorunda değilsiniz. Düz 'ekle ("a"); 'yeterlidir. – Ahe

cevap

2

Hiçbiri, listede hiçbiri değiştirilemediğinden. final'u kullandığınızda, bunu değişmez yapmak istediğinizi düşünüyorum. Eğer durum böyle değilse, benim varsayımım için özür dilerim.

Bunu kabul etmekteyim, Collections.unmodifiableList()'a bir göz atmalısınız. Ve ikincisi işe yaramazsa, dfa eskiyi önermekte doğrudur.

başka yolu da bu olabilir,

private final List<String> l = Collections.unmodifiableList(Arrays.asList("a", 
            "b", "c")); 
+0

İkinci örnek final, yani anonim bloğun içerisine girebiliyorum. Bu yanlış yönlendirilmiş çünkü buna ihtiyacınız yok ve l.add ("a") 'yerine 'ekle (" a ")' yazabilirsin, ama bunun sözde-değişmezlikten ziyade sebebi olduğunu varsayalım. – cletus

6

sonraki türden statik fabrika yöntemleri kullanarak tercih:

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

demektir ki, önümüzdeki şekilde kodunuzda kullanabilirsiniz:

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

Böylece listeleri oluşturma ve doldurma nispeten kompakt bir şekilde olsun ve generic de çoğaltmak gerekmez clarations. Not, list yönteminin sadece dizinin liste görünümünü yaratır. Öğelere daha sonra ekleyemezsiniz (veya kaldırırsınız). Bu arada newArrayList, alışılmış ArrayList nesnesini oluşturur. Bu yardımcı yöntemler (ve diğer birçok yararlı şey), Google Collections kitaplığında (şimdi Guava projesinin bir parçası olan) bulunabilir, not Joachim Sauer belirtildiği gibi.

+1

Bunu bir oylama yapmak zorundayım çünkü bu, birçok projede kullandığım yaklaşım. Ancak, 'Ana' örneğindeki statik ithalatı unuttun sanırım :) – Christoffer

+0

IDE genellikle benim için onları ekler) – Rorick

+2

Google Koleksiyonlar bunu sizin için (ve başka pek çok şey) yapar. Bu fabrika yöntemleri örneğin 'Listeler' sınıfındadır. –

İlgili konular