khởi tạo một bản đồ ổi bất biến


140

Quả ổi cung cấp một lối tắt đẹp để khởi tạo bản đồ. Tuy nhiên, tôi gặp lỗi trình biên dịch sau (Eclipse Indigo) khi bản đồ của tôi khởi tạo thành chín mục.

Phương thức of(K, V, K, V, K, V, K, V, K, V)trong loại ImmutableMapkhông áp dụng cho các đối số (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

Thông báo xuất hiện để nói rằng

Một ImmutableMap có kích thước tối đa là bốn cặp khóa, giá trị.

Rõ ràng, đây không thể là trường hợp nhưng tôi không thể biết phải làm gì để tăng kích thước của trình khởi tạo.

Ai đó có thể cho tôi biết những gì đang thiếu?

Câu trả lời:


256

Lưu ý rằng thông báo lỗi của bạn chỉ chứa năm K, Vcặp, tổng cộng 10 đối số. Đây là do thiết kế; lớp ImmutableMap cung cấp sáu of()phương thức khác nhau , chấp nhận giữa 0 và năm cặp giá trị khóa. Không có of(...)tình trạng quá tải chấp nhận tham số varags vì KVcó thể là các loại khác nhau.

Bạn muốn một ImmutableMap.Builder:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

Cảm ơn câu trả lời nhanh. Tôi quyết định dùng thử Guava vì tôi không muốn phải nhập tất cả các 'đặt' theo yêu cầu của trình khởi tạo bản đồ tiêu chuẩn. Có rất nhiều ý kiến!
dùng903724

7
@ user903724: Lý do chính để sử dụng Guava ở đây là tính bất biến mạnh mẽ, IMO.
Jon Skeet

2
Điều đó, hoặc mức tiêu thụ bộ nhớ giảm nhẹ - và cú pháp của trình xây dựng khá trôi chảy, khi mọi thứ diễn ra.
Louis Wasserman

2
tốt, bạn có thể vẫn còn nhiều lượt đặt, nhưng hiện tại họ đang sử dụng API trôi chảy, do đó không cần lặp lại myMapcho mỗi lượt.put
Kevin Welker

21
Cũng lưu ý cách mã ví dụ của Jon có thể là một public static finalvà nó vẫn hoạt động, không cần phương thức trợ giúp hoặc trình static{}khởi tạo!
Kevin Bourrillion

62

nếu bản đồ ngắn bạn có thể làm:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

Nếu nó dài hơn:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

9
Ngoài khả năng đọc, bạn có thể sử dụng ImmutableMap.ofnhà máy tĩnh cho tối đa năm cặp giá trị chính. Sau đó, bạn phải sử dụng xây dựng.
Xaerxess

0

"đặt" đã không được chấp nhận , không sử dụng nó, thay vào đó hãy sử dụng .of

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);

3
Không. ImmutableMap.put không được dùng nữa. Jon Skeet đang sử dụng ImmutableMap.Builder.put, đây chính xác là cách chúng ta nên khởi tạo một bản đồ với hơn 5 bộ dữ liệu.
i2B
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.