Yanıtlar:
Temel fark, değiştirilemez bir liste, yani öğe ekleyemeyeceğiniz bir liste Collections.emptyList()
döndürmesidir . (Aynısı Java 9'da tanıtılanlar için de geçerlidir .)List.of()
Eğer Nadiren do döndü listesinde değişiklik yapmak istiyorum, Collections.emptyList()
ve List.of()
böylece vardır değil iyi bir seçenek.
Sözleşme (dokümantasyon) açıkça farklı bir şekilde belirtilmediği sürece değişmez bir listeyi döndürmenin mükemmel bir şekilde (ve hatta tercih edilen yol) olduğunu söyleyebilirim.
Ayrıca, emptyList()
her çağrıda yeni bir nesne oluşturmayabilir.
Bu yöntemin uygulamalarının her çağrı için ayrı bir List nesnesi oluşturması gerekmez. Bu yöntemin kullanılması, benzer adlı alanı kullanmanın karşılaştırılabilir maliyetine sahip olabilir. (Bu yöntemin aksine, alan tip güvenliği sağlamaz.)
Görünümlerin uygulanması emptyList
aşağıdaki gibidir:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Dolayısıyla, yönteminiz (boş bir liste döndürür) çok sık çağrılırsa, bu yaklaşım size hem CPU hem de bellek açısından biraz daha iyi performans verebilir.
NullPointerException
geri dönerek elde edemez . Collections.emptyList()
null
Collections.emptyList()
yinelenebilir ve bir uzunluk döndürür, bu nedenle istisna olmadan döngüler için kullanılabilir.
new ArrayList<>()
tasarım kararını da netleştirir; öğeler bu listeye eklenmeyecek.
Java 5.0 ile başlayarak kaptaki öğenin türünü belirleyebilirsiniz:
Collections.<Foo>emptyList()
Boş kalan boş bir listeyi geri döndürmek istediğiniz durumlarda bu yaklaşımı kullanmanız gereken diğer yanıtlarla hemfikirim.
List<Foo> list = Collections.emptyList()
Collections.emptyList
değişmezdir, bu nedenle iki sürüm arasında bir fark vardır, bu nedenle döndürülen değeri dikkate almanız gerekir.
Geri dönmek new ArrayList<Foo>
, nesnenin her zaman yeni bir örneğini oluşturur, bu nedenle, size kullanım için bir neden verebilecek çok hafif bir ekstra maliyete sahiptir Collections.emptyList
. emptyList
Daha okunabilir olduğu için kullanmayı seviyorum .
Yine de dikkatli olun. Eğer geri dönüp Collections.emptyList()
sonra onun gibi add()
ya da böyle bir şeyle bazı değişiklikler yapmaya çalışırsanız , u bir değişmez nesne döndürür UnsupportedOperationException()
çünkü olacaktır Collections.emptyList()
.
Birlikte gider Collections.emptyList()
yoksa ben 2 seçeneği ile gider, iade listesi (liste değişmez olduğu gibi) herhangi bir şekilde değiştirilen değilse.
Avantajı, Collections.emptyList()
her seferinde aynı statik örneğin döndürülmesidir ve bu nedenle her çağrı için örnek oluşturma olmaz.
Döndürülen listenin hiçbir zaman değiştirilmediğinden emin olmak istiyorsanız Collections.emptyList () kullanın. EmptyList () çağrıldığında döndürülen budur:
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();
Collections.emptyList()
inşaat maliyeti olup olmadığını öğrenmek için çalışırken geldi . Uygulama ayrıntılarını görmek (muhtemelen tüm JVM'lerde aynı olmasa da) bunu doğrulamaz. @Atul, bu hangi JVM'den?
Verilen cevaplar emptyList()
değişmez olanı döndüren List
ancak alternatif vermeyenleri vurgular . Yapıcı yerine bu şekilde geri dönen ArrayList(int initialCapacity)
özel durumlar da uygun bir çözüm olabilir:0
new ArrayList<>(0)
new ArrayList<>()
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
[...]
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
(Java 1.8.0_72 kaynakları)
Collections.emptyList()
Diyelim ki hata kontrolü ve benzerleri için daha uygun olur mu?