Sử dụng Bộ sưu tập của Java.singletonList ()?


164

Việc sử dụng Collections.singletonList()trong Java là gì? Tôi hiểu rằng nó trả về một danh sách với một yếu tố. Tại sao tôi muốn có một phương pháp riêng để làm điều đó? Làm thế nào để bất biến đóng một vai trò ở đây?

Có trường hợp sử dụng đặc biệt hữu ích nào cho phương pháp này thay vì chỉ là một phương thức thuận tiện không?


6
Đây là ví dụ về cách nó có thể hữu ích - stackoverflow.com/a/1239431/360811
shabunc


1
@sschuberth, vui lòng so sánh ngày cho các câu hỏi. OP không biết rằng anh ấy có thể sao chép một câu hỏi trong tương lai
KumarAnkit

Đúng, @KumarAnkit, nhưng các liên kết đến các bản sao vẫn hữu ích cho những người tìm kiếm câu trả lời thay thế / có khả năng tốt hơn. Trong thực tế, tôi tin rằng việc liên kết là trùng lặp nên được coi là một điều hai chiều và những câu hỏi / câu trả lời tốt hơn nên được giữ lại, bất kể đó là những câu hỏi cũ hơn hay mới hơn.
sschuberth

@sschuberth, điểm tốt, nhưng nó nên được phân loại tương tự, như câu hỏi này ở đây.
KumarAnkit

Câu trả lời:


159

Các javadoc nói điều này:

"Trả về một danh sách bất biến chỉ chứa đối tượng đã chỉ định. Danh sách được trả về là tuần tự hóa."

Bạn hỏi:

Tại sao tôi muốn có một phương pháp riêng để làm điều đó?

Chủ yếu là để thuận tiện ... để tiết kiệm bạn phải viết một chuỗi các câu lệnh để:

  • tạo một đối tượng danh sách trống
  • thêm một yếu tố cho nó và
  • bọc nó bằng một cái bọc bất biến.

Nó cũng có thể nhanh hơn một chút và / hoặc tiết kiệm một chút bộ nhớ, nhưng không chắc là những khoản tiết kiệm nhỏ này sẽ đáng kể. (Một ứng dụng tạo ra số lượng lớn các danh sách đơn lẻ là không bình thường để nói rằng ít nhất.)

Làm thế nào để bất biến đóng một vai trò ở đây?

Nó là một phần của đặc tả của phương thức; xem ở trên.

Có trường hợp sử dụng đặc biệt hữu ích nào cho phương pháp này, thay vì chỉ là một phương thức tiện lợi không?

Rõ ràng, có những trường hợp sử dụng thuận tiện khi sử dụng singletonListphương thức này. Nhưng tôi không biết làm thế nào bạn (khách quan) phân biệt giữa trường hợp sử dụng thông thường và trường hợp "đặc biệt hữu ích" ...


26

Đây là một quan điểm về các phương thức singleton:

Tôi đã tìm thấy các phương thức "đơn lẻ" khác nhau này hữu ích để truyền một giá trị duy nhất cho API yêu cầu bộ sưu tập giá trị đó. Tất nhiên, điều này hoạt động tốt nhất khi mã xử lý giá trị truyền vào không cần thêm vào bộ sưu tập.


Bạn có thể giúp tôi hiểu phần này của nhận xét trên? "Tất nhiên, điều này hoạt động tốt nhất khi mã xử lý giá trị truyền vào không cần thêm vào bộ sưu tập." Tôi đã không nhận được nó.
Baggins Bilbo

2
Tôi nghĩ rằng anh ta đề cập đến việc không thể sửa đổi danh sách thông qua, vì nó là một danh sách bất biến.
Daniel Higueras

2
@BilboBaggins - Câu nói đó thật mỉa mai. :-) Cụm từ "điều này hoạt động tốt nhất khi ..." được viết chính xác hơn "điều này chỉ hoạt động hoàn toàn nếu ...".
Stephen C

18

Từ javadoc

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

thí dụ

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

Sử dụng nó khi mã mong đợi một danh sách chỉ đọc, nhưng bạn chỉ muốn truyền một yếu tố trong đó. singletonListlà (chủ đề-) an toàn và nhanh chóng.


Cảm ơn, đây là câu trả lời tốt hơn. Bạn thậm chí còn đưa ra một ví dụ thay vì chỉ đơn giản nói "Rõ ràng có trường hợp sử dụng, nhưng tôi không biết về chúng".
theprogrammer

3

Để trả lời câu hỏi bất di bất dịch của bạn:

Collections.singletonListsẽ tạo ra một Danh sách bất biến. Danh sách không thay đổi (còn được gọi là Danh sách không thể thay đổi) không thể thay đổi nội dung của nó. Các phương pháp để thêm hoặc xóa các mục sẽ đưa ra ngoại lệ nếu bạn cố gắng thay đổi nội dung.

Danh sách đơn chỉ chứa mục đó và không thể thay đổi.


2

Nếu một bộ sưu tập Bất biến / Singleton chỉ một đối tượng chỉ có một đối tượng và không được sửa đổi thêm, thì chức năng tương tự có thể đạt được bằng cách tạo một bộ sưu tập "UnmodifiableCollection" chỉ có một đối tượng. Vì Bộ sưu tập không thể thay đổi có thể đạt được cùng một đối tượng, vậy Bộ sưu tập Singleton phục vụ cho mục đích đặc biệt nào?


Tạo một Bộ sưu tập không thể thay đổi với một đối tượng theo cách "bình thường" và sử dụng phương thức singleton. Sau đó, bạn thấy ngay tại sao.
kap

1

singletonList có thể giữ thể hiện của bất kỳ đối tượng nào. Trạng thái đối tượng có thể được sửa đổi.

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

Chúng tôi không thể định nghĩa danh sách không thể thay đổi như trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.