Java'nın Collections.singletonList () kullanımı?


164

Collections.singletonList()Java'da kullanımı nedir ? Bir öğe içeren bir liste döndürdüğünü anlıyorum. Bunu yapmak için neden ayrı bir yöntem olmasını isterim? Değişmezlik burada nasıl bir rol oynar?

Bu yöntem için sadece uygun bir yöntem olmaktan ziyade herhangi bir yararlı kullanım durumu var mı?


6
İşte nasıl yararlı olabileceğine dair bir örnek - stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth, lütfen soruların tarihlerini karşılaştırın. OP gelecekteki bir soruyu kopyalayabileceğinin farkında değildi
KumarAnkit

Doğru, @KumarAnkit, ancak kopyalara bağlantılar alternatif / potansiyel olarak daha iyi cevaplar arayan insanlar için hala yararlıdır. Aslında, yinelenen olarak bağlantı oluşturmanın iki yönlü bir şey olarak görülmesi gerektiğine ve bunların daha eski veya daha yeni olmasına bakılmaksızın daha iyi sorular / cevaplar saklanması gerektiğine inanıyorum.
sschuberth

@sschuberth, iyi bir nokta, ama burada bu soruya benzer şekilde kategorize edilmelidir.
KumarAnkit

Yanıtlar:


159

Javadoc bu diyor ki:

"Yalnızca belirtilen nesneyi içeren değişmez bir liste döndürür. Döndürülen liste serileştirilebilir."

Sen sor:

Bunu yapmak için neden ayrı bir yöntem olmasını isterim?

Öncelikle bir kolaylık olarak ... bir dizi ifade yazmak zorunda kalmamak için:

  • boş bir liste nesnesi oluştur
  • ona bir eleman ekleyin ve
  • değişmez bir sargı ile sarın.

Ayrıca biraz daha hızlı olabilir ve / veya biraz bellek tasarrufu sağlayabilir, ancak bu küçük tasarrufların önemli olması muhtemel değildir. (Çok sayıda singleton listesi oluşturan bir uygulama en azından söylemek sıra dışıdır.)

Değişmezlik burada nasıl bir rol oynar?

Yöntemin spesifikasyonunun bir parçasıdır; yukarıyı görmek.

Bu yöntem için sadece bir kolaylık yöntemi olmaktan ziyade özel yararlı kullanım durumları var mı?

Açıkçası, singletonListyöntemin kullanılmasının uygun olduğu kullanım durumları vardır . Ama sıradan bir kullanım durumu ile "özel olarak yararlı" bir durumu (nesnel olarak) nasıl ayırt edeceğinizi bilmiyorum ...


26

İşte singleton yöntemlerine bir bakış :

Bu çeşitli "singleton" yöntemleri, bu değerin bir koleksiyon gerektiren bir API için tek bir değer geçirmek için yararlı bulduk. Tabii ki, bu en iyi, geçirilen değeri işleyen kodun koleksiyona eklenmesi gerekmediğinde işe yarar.


Yukarıdaki yorumun bu bölümünü anlamama yardımcı olabilir misiniz? "Tabii ki, bu en iyi, geçirilen değeri işleyen kodun koleksiyona eklenmesi gerekmediğinde işe yarar." Ben anlamadım.
Bilbo Baggins

2
Bence, değişmez bir liste olduğu için, geçilen listeyi değiştiremediğini ifade ediyor.
Daniel Higueras

2
@BilboBaggins - Bu ifade ironikti. :-) "Bu en iyi şekilde çalıştığında ..." ifadesi daha doğru bir şekilde yazılırsa "bu yalnızca ... durumunda işe yarar."
Stephen C

18

Javadoc'tan

@param  the sole object to be stored in the returned list.
@return an immutable list containing only the specified object.

misal

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        // create an array of string objs
        String initList[] = { "One", "Two", "Four", "One",};

        // create one list
        List list = new ArrayList(Arrays.asList(initList));

        System.out.println("List value before: "+list);

        // create singleton list
        list = Collections.singletonList("OnlyOneElement");
        list.add("five"); //throws UnsupportedOperationException
        System.out.println("List value after: "+list);
    }
}

Kod salt okunur bir liste beklediğinde kullanın, ancak bu listeye yalnızca bir öğe iletmek istiyorsunuz. singletonListgüvenli ve hızlıdır.


Teşekkürler, bu daha iyi cevap. "Açıkça kullanım örnekleri var, ama onlar hakkında bir şey bilmiyorum" demek yerine bir örnek bile veriyorsunuz.
theprogrammer

3

Değişmez sorunuza cevap vermek için:

Collections.singletonListdeğişmez bir Liste oluşturur. Değişmez bir Liste (değiştirilemez Liste olarak da adlandırılır) içeriğinin değiştirilmesini sağlayamaz. İçeriği değiştirmeye çalışırsanız, öğe ekleme veya kaldırma yöntemleri istisna atar.

Tek bir Liste yalnızca bu öğeyi içerir ve değiştirilemez.


2

Bir Immutable / Singleton koleksiyonu sadece bir nesneye sahip olan ve daha fazla değiştirilmeyen bir koleksiyona atıfta bulunuyorsa, aynı işlevsellik sadece bir nesneye sahip bir "UnmodifiableCollection" koleksiyonu yapılarak elde edilebilir. Aynı işlevsellik bir nesne ile Değiştirilemez Koleksiyon ile elde edilebildiğinden, Singleton Koleksiyonu hangi özel amaca hizmet eder?


Bir nesne ile "normal" yolla ve singleton yöntemini kullanarak Değiştirilemez Koleksiyon oluşturun. Sonra hemen nedenini görüyorsunuz.
kap

1

singletonList herhangi bir nesnenin örneğini tutabilir. Nesne durumu değiştirilebilir.

List<Character> list = new ArrayList<Character>();
list.add('X');
list.add('Y');
System.out.println("Initial list: "+ list);
List<List<Character>> list2 = Collections.singletonList(list);
list.add('Z');
System.out.println(list);
System.out.println(list2);

Değiştirilemez Listeyi yukarıdaki gibi tanımlayamayız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.