Gunakan Java's Collections.singletonList ()?


164

Apa gunanya Collections.singletonList()di Jawa? Saya mengerti bahwa ia mengembalikan daftar dengan satu elemen. Mengapa saya ingin memiliki metode terpisah untuk melakukan itu? Bagaimana kekekalan berperan di sini?

Apakah ada kasus penggunaan khusus yang bermanfaat untuk metode ini daripada hanya menjadi metode yang nyaman?


6
Berikut ini contoh bagaimana ini bisa berguna - stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth, harap bandingkan tanggal untuk pertanyaan. OP tidak sadar bahwa ia dapat menduplikasi pertanyaan di masa depan
KumarAnkit

Benar, @KumarAnkit, tetapi tautan ke duplikat masih bermanfaat bagi orang yang mencari alternatif / jawaban yang berpotensi lebih baik. Sebenarnya saya percaya menghubungkan sebagai duplikat harus dianggap sebagai hal dua arah, dan pertanyaan / jawaban yang lebih baik harus dijaga, tidak peduli apakah ini lebih tua atau lebih baru.
sschuberth

@sschuberth, poin bagus, tetapi harus dikategorikan sama, seperti pertanyaan ini di sini.
KumarAnkit

Jawaban:


159

The javadoc mengatakan ini:

"Mengembalikan daftar yang tidak berubah yang hanya berisi objek yang ditentukan. Daftar yang dikembalikan adalah serial."

Anda bertanya:

Mengapa saya ingin memiliki metode terpisah untuk melakukan itu?

Utamanya sebagai kenyamanan ... untuk menyelamatkan Anda, Anda harus menulis urutan pernyataan ke:

  • buat objek daftar kosong
  • tambahkan elemen ke dalamnya, dan
  • bungkus dengan bungkus abadi.

Mungkin juga sedikit lebih cepat dan / atau menghemat sedikit memori, tetapi kecil kemungkinan penghematan kecil ini akan signifikan. (Aplikasi yang membuat daftar singleton dalam jumlah besar adalah hal yang tidak biasa.)

Bagaimana kekekalan berperan di sini?

Ini adalah bagian dari spesifikasi metode; Lihat di atas.

Apakah ada kasus penggunaan khusus yang bermanfaat untuk metode ini, daripada sekadar metode kenyamanan?

Jelas, ada kasus penggunaan di mana nyaman untuk menggunakan singletonListmetode ini. Tapi saya tidak tahu bagaimana Anda akan (secara objektif) membedakan antara kasus penggunaan biasa dan yang "berguna" ...


26

Inilah satu pandangan tentang metode tunggal:

Saya telah menemukan berbagai metode "singleton" ini berguna untuk meneruskan nilai tunggal ke API yang memerlukan koleksi nilai itu. Tentu saja, ini bekerja paling baik ketika kode memproses nilai yang diteruskan tidak perlu ditambahkan ke koleksi.


Bisakah Anda membantu saya memahami bagian dari komentar di atas? "Tentu saja, ini bekerja paling baik ketika kode memproses nilai yang diteruskan tidak perlu ditambahkan ke koleksi." Saya tidak mengerti.
Bilbo Baggins

2
Saya pikir dia merujuk tidak dapat memodifikasi daftar yang lewat, karena itu adalah daftar yang tidak dapat diubah.
Daniel Higueras

2
@BilboBaggins - Pernyataan itu ironis. :-) Ungkapan "ini bekerja paling baik ketika ..." ditulis lebih akurat "ini hanya berfungsi sama sekali jika ...".
Stephen C

18

Dari javadoc

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

contoh

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

Gunakan ketika kode mengharapkan daftar read-only, tetapi Anda hanya ingin melewatkan satu elemen di dalamnya. singletonList(thread-) aman dan cepat.


Terima kasih, ini jawaban yang lebih baik. Anda bahkan memberikan contoh alih-alih hanya mengatakan "Jelas ada kasus penggunaan, tapi saya tidak tahu tentang mereka".
Pemrogram

3

Untuk menjawab pertanyaan abadi Anda:

Collections.singletonListakan membuat Daftar abadi. Daftar yang tidak dapat diubah (juga disebut sebagai Daftar yang tidak dapat dimodifikasi) tidak dapat mengubah isinya. Metode untuk menambah atau menghapus item akan mengeluarkan pengecualian jika Anda mencoba mengubah konten.

Daftar tunggal hanya berisi item itu dan tidak dapat diubah.


2

Jika koleksi Immutable / Singleton merujuk ke satu yang hanya memiliki satu objek dan yang tidak dimodifikasi lebih lanjut, maka fungsi yang sama dapat dicapai dengan membuat koleksi "Koleksi Tidak Dapat Diubah-ubah" yang hanya memiliki satu objek. Karena fungsi yang sama dapat diraih oleh Unmodifiable Collection dengan satu objek, lalu tujuan khusus apa yang dimiliki Singleton Collection?


Buat Koleksi yang Tidak Dapat Diubah dengan satu objek dengan cara "normal" dan menggunakan metode singleton. Maka Anda segera melihat mengapa.
kap

1

singletonList dapat menyimpan instance dari objek apa pun. Keadaan objek dapat dimodifikasi.

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

Kami tidak dapat mendefinisikan Daftar yang tidak dapat dimodifikasi seperti di atas.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.