Sự khác biệt giữa Collections.emptyList () và Collections.EMPTY_LIST là gì


105

Trong Java, chúng tôi có Collections.emptyList ()Collections.EMPTY_LIST . Cả hai đều có cùng thuộc tính:

Trả về danh sách trống (không thay đổi). Danh sách này có thể được nối tiếp.

Vì vậy, sự khác biệt chính xác giữa việc sử dụng cái này hay cái kia là gì?

Câu trả lời:


130
  • Collections.EMPTY_LIST trả về một kiểu cũ List
  • Collections.emptyList() sử dụng kiểu suy luận và do đó trả về List<T>

Collections.emptyList () đã được thêm vào Java 1.5 và nó có lẽ luôn được ưu tiên hơn . Bằng cách này, bạn không cần phải truyền xung quanh mã của mình một cách không cần thiết.

Collections.emptyList()thực chất là diễn viên cho bạn .

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

1
Tôi không chắc chắn 100% về điều này, nhưng tôi tin rằng việc sử dụng / trả về phiên bản không định kiểu (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) khiến trình biên dịch từ bỏ việc kiểm tra kiểu chung trong chuỗi lệnh gọi nhất định. Về cơ bản, nó cho thấy rằng nó đã đi lạc vào mã cũ thiếu các loại chung chung và bỏ cuộc.
Matt Passell

18

Hãy truy cập vào nguồn:

 public static final List EMPTY_LIST = new EmptyList<>();

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

13

Chúng là những vật thể bình đẳng tuyệt đối.

public static final List EMPTY_LIST = new EmptyList<>();

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

Duy nhất là emptyList()trả về chung chung List<T>, vì vậy bạn có thể gán danh sách này cho tập hợp chung mà không có bất kỳ cảnh báo nào.


13

Nói cách khác, EMPTY_LIST không phải là loại an toàn:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

So với:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();
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.