2009-03-11 40 views
73

Tôi cần tạo bản đồ trống.Cách tốt nhất để tạo bản đồ trống trong Java

if (fileParameters == null) 
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP; 

Vấn đề là các mã trên tạo ra cảnh báo này: Loại an toàn: không đánh dấu đúc từ Map để HashMap

cách tốt nhất để tạo bản đồ này trống là gì?

+0

Loại khai báo của bạn cho tệpParameters là gì? – jjnguy

+0

Có thể bạn cũng sẽ nhận được một ClassCastException. –

+1

tệpParameters phải là một Bản đồ chứ không phải là Bản đồ HashMap. –

Trả lời

143

1) Nếu bản đồ có thể không thay đổi:

Collections.emptyMap(); 

// or, in some cases: 
Collections.<String, String>emptyMap(); 

Bạn sẽ phải sử dụng sau này đôi khi trình biên dịch không thể tự động tìm ra loại bản đồ nào cần thiết (điều này được gọi là type inference). Ví dụ, hãy xem xét một phương pháp tuyên bố như thế này:

public void foobar(Map<String, String> map){ ... } 

Khi đi qua các Map trống trực tiếp với nó, bạn phải rõ ràng về loại:

foobar(Collections.emptyMap());     // doesn't compile 
foobar(Collections.<String, String>emptyMap()); // works fine 

2) Nếu bạn cần có thể sửa đổi bản đồ, sau đó ví dụ:

new HashMap<String, String>(); 

(như tehblanx pointed out)


Phụ Lục: nếu dự án của bạn sử dụng Guava, bạn có những lựa chọn sau:

1) Immutable bản đồ:

ImmutableMap.of(); 
// or: 
ImmutableMap.<String, String>of(); 

Cấp, không có lợi ích lớn ở đây so với Collections.emptyMap(). From the Javadoc:

bản đồ này hoạt động và thực hiện tương đối để Collections.emptyMap(), và là một lợi thế chủ yếu để ổn định và bảo trì mã của bạn.

2) Bản đồ mà bạn có thể sửa đổi:

Maps.newHashMap(); 
// or: 
Maps.<String, String>newHashMap(); 

Maps chứa phương pháp nhà máy tương tự cho instantiating các loại bản đồ cũng như TreeMap hoặc LinkedHashMap.

+0

Trong hầu hết các trường hợp, các công trình suy luận kiểu (tức là bản đồ = Collections.emptyMap() hoạt động) –

+0

Vâng, đúng vậy. Tôi đã chỉnh sửa câu trả lời để toàn diện hơn một chút. – Jonik

9

Nếu bạn cần một thể hiện của HashMap, cách tốt nhất là:

fileParameters = new HashMap<String,String>(); 

Kể từ Map là một giao diện, bạn cần phải chọn một số lớp mà instantiates nó nếu bạn muốn tạo một thể hiện rỗng. HashMap có vẻ tốt như bất kỳ khác - vì vậy chỉ cần sử dụng.

13
+0

Vấn đề là bản đồ này chỉ có thể được áp dụng cho đối tượng Bản đồ không phải là HashMap – JorgeO

+6

Bạn nên (thường) tránh khai báo các đối tượng thuộc loại cụ thể của chúng và thay vào đó sử dụng giao diện (hoặc bố mẹ trừu tượng). Cố gắng tránh "HashMap foo;" và sử dụng "Bản đồ foo;" thay vì – TofuBeer

+0

+1 TofuBeer (nếu chỉ tôi có thể) –

6

Hoặc Collections.emptyMap(), hoặc nếu suy luận kiểu không hoạt động trong trường hợp của bạn,
Collections.<String, String>emptyMap()

1

Vì trong nhiều trường hợp một bản đồ trống được sử dụng cho thiết kế null-an toàn, bạn có thể sử dụng phương pháp nullToEmpty tiện ích:

class MapUtils { 

    static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) { 
    if (map != null) { 
     return map; 
    } else { 
     return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of() 
    } 
    } 

} 

Tương tự như vậy cho bộ:

class SetUtils { 

    static <T> Set<T> nullToEmpty(Set<T> set) { 
    if (set != null) { 
     return set; 
    } else { 
     return Collections.<T>emptySet(); 
    } 
    } 

} 

và danh sách:

class ListUtils { 

    static <T> List<T> nullToEmpty(List<T> list) { 
    if (list != null) { 
     return list; 
    } else { 
     return Collections.<T>emptyList(); 
    } 
    } 

} 
Các vấn đề liên quan