ใช้ Collections.singletonList ของ Java () หรือไม่


164

การใช้งานCollections.singletonList()ใน Java คืออะไร? ฉันเข้าใจว่ามันส่งคืนรายการที่มีองค์ประกอบเดียว เหตุใดฉันจึงต้องการแยกวิธีการทำเช่นนั้น การไม่เปลี่ยนรูปแบบมีบทบาทอย่างไรที่นี่?

มีกรณีการใช้ประโยชน์พิเศษสำหรับวิธีนี้แทนที่จะเป็นเพียงวิธีที่สะดวกหรือไม่?


6
นี่คือตัวอย่างของวิธีการที่มีประโยชน์ - stackoverflow.com/a/1239631/360811
shabunc

1
อาจเป็นไปได้ซ้ำกับArrays.asList () vs Collections.singletonList ()
sschuberth

1
@sschuberth โปรดเปรียบเทียบวันที่สำหรับคำถาม OP ไม่ทราบว่าเขา / เธอสามารถทำซ้ำคำถามในอนาคตได้
KumarAnkit

จริง @KumarAnkit แต่ลิงก์ไปยังรายการที่ซ้ำกันยังคงมีประโยชน์สำหรับผู้ที่มองหาคำตอบอื่น / อาจดีกว่า ในความเป็นจริงฉันเชื่อว่าการลิงก์ซ้ำซ้อนควรถือเป็นแบบสองทิศทางและควรเก็บคำถาม / คำตอบที่ดีกว่าไม่ว่าสิ่งเหล่านี้จะเก่าหรือใหม่กว่าก็ตาม
sschuberth

@sschuberth จุดดี แต่มันควรจะจัดหมวดหมู่เหมือนกันตามคำถามนี้ที่นี่
KumarAnkit

คำตอบ:


159

Javadocกล่าวนี้:

"ส่งคืนรายการที่ไม่สามารถเปลี่ยนแปลงได้ซึ่งมีเฉพาะวัตถุที่ระบุรายการที่ส่งคืนเป็นแบบอนุกรม"

คุณถาม:

ทำไมฉันต้องการแยกวิธีการทำเช่นนั้น?

ส่วนใหญ่เป็นการอำนวยความสะดวก ... เพื่อช่วยให้คุณไม่ต้องเขียนลำดับของข้อความไปที่:

  • สร้างวัตถุรายการที่ว่างเปล่า
  • เพิ่มองค์ประกอบให้กับมันและ
  • ห่อด้วยกระดาษห่อเปลี่ยนรูป

อาจเร็วขึ้นและ / หรือบันทึกหน่วยความจำเล็กน้อย แต่ก็ไม่น่าที่การประหยัดเล็กน้อยเหล่านี้จะมีนัยสำคัญ (แอปพลิเคชันที่สร้างรายการซิงเกิลจำนวนมหาศาลเป็นเรื่องผิดปกติที่จะพูดน้อยที่สุด)

การไม่เปลี่ยนรูปแบบมีบทบาทอย่างไรที่นี่?

มันเป็นส่วนหนึ่งของคุณสมบัติของวิธีการนั้น ดูด้านบน.

มีกรณีการใช้งานพิเศษที่เป็นประโยชน์สำหรับวิธีนี้แทนที่จะเป็นเพียงวิธีการอำนวยความสะดวกหรือไม่?

เห็นได้ชัดว่ามีกรณีการใช้งานที่สะดวกในการใช้singletonListวิธีการ แต่ฉันไม่รู้ว่าคุณจะแยกแยะความแตกต่างระหว่างกรณีการใช้งานทั่วไปกับ "ประโยชน์พิเศษ" อย่างไร ...


26

นี่คือมุมมองหนึ่งของวิธีการแบบซิงเกิล:

ฉันพบวิธีการ "ซิงเกิล" แบบต่างๆเหล่านี้มีประโยชน์สำหรับการส่งค่าเดียวไปยัง API ที่ต้องการการรวบรวมค่านั้น แน่นอนว่าวิธีนี้จะทำงานได้ดีที่สุดเมื่อการประมวลผลโค้ดไม่จำเป็นต้องเพิ่มลงในคอลเลกชัน


คุณช่วยฉันเข้าใจส่วนนี้ของความคิดเห็นข้างต้นได้ไหม "แน่นอนว่าวิธีนี้จะทำงานได้ดีที่สุดเมื่อการประมวลผลรหัสผ่านไม่จำเป็นต้องเพิ่มในคอลเลกชัน" ฉันไม่เข้าใจ
Bilbo Baggins

2
ฉันคิดว่าเขาหมายถึงไม่สามารถแก้ไขรายการส่งผ่านได้เนื่องจากเป็นรายการที่ไม่เปลี่ยนรูป
Daniel Higueras

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

ใช้เมื่อรหัสคาดว่าจะมีรายชื่ออ่านอย่างเดียว แต่คุณต้องการที่จะผ่านองค์ประกอบหนึ่งในนั้น singletonListis (thread-) ปลอดภัยและรวดเร็ว


ขอบคุณนี่คือคำตอบที่ดีกว่า คุณยังยกตัวอย่างแทนที่จะพูดว่า "เห็นได้ชัดว่ามีการใช้เคส แต่ฉันไม่รู้เกี่ยวกับพวกเขา"
theprogrammer

3

ในการตอบคำถามที่ไม่เปลี่ยนรูปของคุณ:

Collections.singletonListจะสร้างรายการที่ไม่เปลี่ยนรูป รายการที่ไม่เปลี่ยนรูป (เรียกอีกอย่างว่ารายการที่แก้ไขไม่ได้) ไม่สามารถเปลี่ยนเนื้อหาได้ วิธีการเพิ่มหรือลบรายการจะมีข้อยกเว้นหากคุณพยายามแก้ไขเนื้อหา

รายการเดี่ยวมีเพียงรายการนั้นและไม่สามารถเปลี่ยนแปลงได้


2

ถ้าคอลเลกชันที่ไม่เปลี่ยนรูป / เดี่ยวหมายถึงสิ่งที่มีเพียงหนึ่งวัตถุและที่ไม่ได้รับการแก้ไขเพิ่มเติมจากนั้นการทำงานเดียวกันสามารถทำได้โดยการรวบรวม "UnmodifiableCollection" ที่มีเพียงวัตถุเดียว เนื่องจากการทำงานที่เหมือนกันสามารถทำได้โดย Unmodifiable Collection กับวัตถุหนึ่งชิ้นดังนั้น Singleton Collection จึงมีจุดประสงค์พิเศษอะไร?


สร้างคอลเลกชัน Unmodifiable ด้วยวัตถุหนึ่งในวิธี "ปกติ" และใช้วิธีการเดี่ยว แล้วคุณจะเห็นได้ทันทีว่าทำไม
kap

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.