Використання Java's Collections.singletonList ()?


164

Для чого використовують Collections.singletonList()Java? Я розумію, що він повертає список з одним елементом. Чому я хотів би мати окремий метод для цього? Як тут незмінність відіграє роль?

Чи є якісь спеціальні корисні випадки використання цього методу, а не просто зручний метод?


6
Ось приклад того , як це може бути корисно - stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth, будь ласка, порівняйте дати для запитань. ОП не знав, чи він може дублювати майбутнє питання
KumarAnkit

Щоправда, @KumarAnkit, але посилання на дублікати все ще корисні людям, які шукають альтернативні / потенційно кращі відповіді. Насправді, я вважаю, що посилання як дублікат слід розглядати як двонаправлене, і краще зберігати питання / відповіді, незалежно від того, старіші вони чи новіші.
sschuberth

@sschuberth, хороший момент, але його слід віднести до подібного, як це питання тут.
KumarAnkit

Відповіді:


159

Javadoc каже , що це:

"Повертає незмінний список, що містить лише вказаний об'єкт. Повернений список можна серіалізувати."

Ви запитаєте:

Чому я хотів би мати окремий метод для цього?

Перш за все, для зручності ... щоб заощадити вам потрібно написати послідовність висловлювань на:

  • створити об'єкт порожнього списку
  • додайте до нього елемент та
  • оберніть його незмінною обгорткою.

Це також може бути трохи швидшим та / або зберегти трохи пам’яті, але навряд чи ці невеликі заощадження будуть значними. (Програма, яка створює величезну кількість однотонних списків, як мінімум, незвично.)

Як тут незмінність відіграє роль?

Це частина специфікації методу; Дивись вище.

Чи існують якісь спеціальні корисні випадки використання цього методу, а не просто зручні методи?

Зрозуміло, що є випадки використання, коли зручно використовувати singletonListметод. Але я не знаю, як би ви (об'єктивно) розрізняли звичайний випадок використання та "особливо корисний" ...


26

Ось один погляд на методи одиночки:

Я виявив ці різні "однотонні" методи корисними для передачі єдиного значення в API, який вимагає колекції цього значення. Звичайно, це найкраще працює, коли код, що обробляє передане значення, не потрібно додавати до колекції.


Чи можете ви допомогти мені зрозуміти цю частину вищевказаного коментаря? "Звичайно, це найкраще працює, коли код, який обробляє передане значення, не потрібно додавати до колекції." Я цього не зрозумів.
Більбо Баггінс

2
Я думаю, що він посилається на те, що не може змінювати список, що передається, оскільки це непорушний.
Даніель Ігуерас

2
@BilboBaggins - Це твердження було іронічним. :-) Фраза "це найкраще працює, коли ..." точніше написана "це працює взагалі, якщо ...".
Стівен С

18

Від javadoc

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

приклад

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

Використовуйте його, коли код очікує список, доступний лише для читання, але ви хочете передати лише один елемент у ньому. singletonListбезпечно та швидко.


Спасибі, це краща відповідь. Ви навіть наводите приклад, а не просто говорите: "Ясно, що випадки використання є, але я не знаю про них".
theprogrammer

3

Щоб відповісти на ваше незмінне питання:

Collections.singletonListстворить Незмінний Список. Список, що не змінюється (також його називають незмінним списком), не може змінювати його вміст. Методи додавання або видалення елементів викинуть винятки, якщо ви спробуєте змінити вміст.

Одномісний список містить лише цей елемент, і його неможливо змінити.


2

Якщо колекція Immutable / Singleton посилається на ту, яка має лише один об'єкт і яка далі не змінюється, то така ж функціональність може бути досягнута шляхом створення колекції "UnmodifiableCollection", що містить лише один об'єкт. Оскільки однаковий функціонал може бути досягнутий Немодифікованою колекцією з одним об’єктом, то для якої особливої ​​цілі служить колекція Singleton?


Створіть немодифіковану колекцію з одним об’єктом «нормальним» способом та за допомогою методу синглтон. Тоді ви відразу бачите, чому.
кап

1

singletonList може містити примірник будь-якого об’єкта. Стан об'єкта можна змінювати.

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

Ми не можемо визначити незмінний список, як вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.