JavaのCollections.singletonList()の使用?


164

Collections.singletonList()Javaでの使用は何ですか?1つの要素を含むリストを返すことを理解しています。それを行う別の方法が必要なのはなぜですか?ここで不変性はどのように役割を果たしますか?

単に便利な方法ではなく、この方法の特別な有用なユースケースはありますか?


6
それはどのように活用できるかのここでの例- stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth、質問の日付を比較してください。OPは、将来の質問を複製する可能性があることを認識していませんでした
KumarAnkit

確かに、@ KumarAnkitですが、重複へのリンクは、代替/潜在的により良い答えを探している人々にとって依然として役立ちます。実際、重複としてリンクすることは双方向のものと見なすべきであり、古いものでも新しいものでも、より良い質問/回答を保持する必要があります。
sschuberth

@sschuberth、良い点ですが、この質問のように、同様に分類する必要があります。
KumarAnkit 2019

回答:


159

Javadocはこのことを言います:

「指定されたオブジェクトのみを含む不変のリストを返します。返されたリストは直列化可能です。」

あなたが尋ねる:

それを行う別の方法が必要なのはなぜですか?

主に便宜上...一連のステートメントを次のように記述する必要をなくすために:

  • 空のリストオブジェクトを作成する
  • それに要素を追加し、
  • それを不変のラッパーでラップします。

また、少し高速化したり、メモリを少し節約したりすることもできますが、これらの小さな節約が重要になることはほとんどありません。(膨大な数のシングルトンリストを作成するアプリケーションは、控えめに言っても異常です。)

ここで不変性はどのように役割を果たしますか?

これはメソッドの仕様の一部です。上記を参照。

このメソッドには、単なる便利なメソッドではなく、特別な便利なユースケースがありますか?

明らかに、singletonListメソッドを使用すると便利なユースケースがあります。しかし、通常のユースケースと「特別に役立つ」ユースケースを(客観的に)区別する方法がわかりません...


26

シングルトンメソッドの1つのビューを次に示します。

これらのさまざまな「シングルトン」メソッドが、単一の値を、その値のコレクションを必要とするAPIに渡すのに役立つことがわかりました。もちろん、これは、渡された値を処理するコードがコレクションに追加する必要がない場合に最適に機能します。


上記のコメントのこの部分を理解できますか?「もちろん、これは、渡された値を処理するコードがコレクションに追加する必要がない場合に最適に機能します。」わかりませんでした。
ビルボバギンズ2016

2
渡されたリストは不変であるため、変更できないことを彼は言及していると思います。
Daniel Higueras、2016年

2
@BilboBaggins-その発言は皮肉でした。:-)「これは...のときに最もよく機能する」というフレーズは、「これは...の場合にのみ機能する」より正確に記述されています。
スティーブンC

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

コードが読み取り専用リストを想定しているが、1つの要素のみを渡したい場合に使用します。singletonList(スレッド)安全で高速です。


ありがとう、これはより良い答えです。「明らかにユースケースはあるが、私はそれらについて知らない」と単に言うのではなく、例を挙げさえします。
プログラマ

3

不変の質問に答えるには:

Collections.singletonList不変のリストを作成します。不変リスト(変更不可能なリストとも呼ばれます)では、内容を変更できません。アイテムを追加または削除するメソッドは、内容を変更しようとすると例外をスローします。

シングルトンリストにはそのアイテムのみが含まれ、変更できません。


2

イミュータブル/シングルトンコレクションがオブジェクトを1つだけ持ち、それ以上変更されないコレクションを参照する場合、同じ機能は、オブジェクトを1つだけ持つコレクション "UnmodifiableCollection"を作成することで実現できます。同じ機能が1つのオブジェクトを使用したUnmodifiable Collectionによって実現できるので、シングルトンコレクションが果たす特別な目的は何ですか?


1つのオブジェクトを「通常の」方法で使用し、シングルトンメソッドを使用して、変更不可能なコレクションを作成します。その後、すぐに理由がわかります。
2014

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

上記のようにunmodifiableListを定義することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.