2012-09-26 37 views
6

thể trùng lặp:
Collections.emptyList() vs. new instanceTại sao một người nào đó sử dụng Collections.emptyList trong java?

Tôi đã cố gắng tìm hiểu sự khác biệt giữa tạo ra một thể hiện mới của một danh sách sử dụng:

new ArrayList<X> 

Collections.emptyList(); 

Như tôi đã hiểu, sau này trả về một danh sách bất biến. Điều đó có nghĩa là không thể thêm, xóa hoặc sửa đổi nó. Tôi muốn biết lý do tại sao một người sẽ tạo ra và bất biến emptyList? sử dụng là gì? cảm ơn

+0

Có thể trả lời [ở đây] (http://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance) –

+2

tính bất biến là tốt cho bạn ! –

Trả lời

13

Giả sử bạn phải trả lại bộ sưu tập và bạn không muốn tạo một vài đối tượng mỗi lần.

interface Configurable { 
    List<String> getConfigurationList(); 
} 

// class which doesn't have any configuration 
class SimpleConfigurable implements Configurable { 
    public List<String> getConfigurationList() { return Collections.emptyList(); } 
} 

Việc trả lại bộ sưu tập trống thường là thích hợp hơn để trở null

+5

Điều gì xảy ra nếu máy khách của lớp SimpleConfigurable cố gắng thêm các phần tử vào danh sách rỗng được trả về bởi getConfigurationList(); – param

+1

Họ nhận được một ngoại lệ, mà có lẽ là những gì bạn muốn là nhà thiết kế của 'SimpleConfigurable'. Nếu tôi có thể diễn giải toàn bộ đối số [lập trình thuần túy] (wikipedia.org/wiki/Pure_function), thì ngữ nghĩa của hàm trả về một đối tượng có thể thay đổi là gì? Thư viện của bạn có thực hiện một số hành động nếu ai đó thêm phần tử vào giá trị trả lại (ví dụ: cập nhật cấu hình được áp dụng) không? Bộ nhớ cache của thư viện của bạn có được trả lại cho người gọi tiếp theo của 'getConfigList()' không? Làm thế nào để bạn thực hiện điều này tất cả an toàn thread? Trả về một danh sách không thể sửa đổi sẽ cho chúng ta một câu trả lời rất đơn giản cho mỗi câu hỏi này. – Groostav

+0

@Groostav Trả lại danh sách unmodifiableList là tốt nhất trừ khi bạn a) sửa đổi mong muốn theo thiết kế b) bạn đã lược tả nó như là một vấn đề hiệu suất. –

12

Không thay đổi cho phép các trường hợp tái sử dụng.

Bộ sưu tập.emptyList sẽ luôn trả về cùng một cá thể đơn lẻ chính xác.

Điều này rất hiệu quả.

Ngoài ra, dữ liệu không thay đổi có thể được chia sẻ an toàn giữa các luồng và được đảm bảo để tránh các tác dụng phụ lạ do lỗi mã hóa. Vì lý do đó nó làm cho bản sao phòng thủ không cần thiết, quá.

7

Tôi thường sử dụng danh sách trống là Null objects: điều này tránh phải kiểm tra null.

+0

Nhưng dù sao chúng ta thậm chí không thể sử dụng get() trên nó, thì lợi ích của nó là gì? Một trong những lợi ích mà tôi tìm thấy là chúng ta có thể lặp lại nó đối diện với null. –

+0

Các phương thức được sử dụng có điều kiện điển hình hơn như 'size()', 'isEmpty()' có thể được gọi. – sevenforce

5

Tôi đã sử dụng Collections.emptyList cho các phương pháp mà trả về một danh sách nhưng điều đó được gọi với các đối số mà không có ý nghĩa.

Ví dụ: ứng dụng xử lý luồng nơi bạn muốn truy cập các phần khác nhau của luồng, có thể dựa trên ngày tháng. Bạn truy vấn một khoảng thời gian của các mục từ luồng nhưng nếu không có mục nào trong khoảng thời gian đó, bạn sẽ trả về một danh sách trống. Ném một ngoại lệ sẽ không có bất kỳ ý nghĩa vì không phải là bất cứ điều gì sai với truy vấn. Trả lại null cũng không có ý nghĩa nhiều vì sau đó tất cả mã gọi cần kiểm tra null.

Trả về danh sách trống không thể cho phép mã gọi xử lý giá trị trả về độc đáo, bạn không cần phải lo lắng về vấn đề luồng vì danh sách bất biến vốn vốn là an toàn.

2

Để tránh không mong muốn NullPointerException.

Trong mã của bạn, bạn có thể trả về một ArrayList "trống" thay vì trả về null. Tuy nhiên, theo cách đó, bạn sẽ tiếp tục tạo ra các đối tượng MỚI (với dung lượng mặc định là 10) trên mỗi lần thực hiện mà không phải là cách tiếp cận hiệu quả của bộ nhớ. Thay vào đó nếu bạn trả về emptyList, cùng một cá thể sẽ được trả về trên mọi lời gọi. Bằng cách này, nó giúp bạn tiết kiệm từ NullPointerException không mong muốn một cách hiệu quả hơn.Dưới đây là ảnh chụp từ Javadoc cho emptyList:

/** 
* Returns the empty list (immutable). This list is serializable. 
* 
* <p>This example illustrates the type-safe way to obtain an empty list: 
* <pre> 
*  List&lt;String&gt; s = Collections.emptyList(); 
* </pre> 
* Implementation note: Implementations of this method need not 
* create a separate <tt>List</tt> object for each call. Using this 
* method is likely to have comparable cost to using the like-named 
* field. (Unlike this method, the field does not provide type safety.) 
* 
* @see #EMPTY_LIST 
* @since 1.5 
*/ 
Các vấn đề liên quan