2015-02-09 19 views
8

Tôi biết tôi có thể tuyên bố và khởi tạo một List sử dụng dấu ngoặc kép:khởi cú đúp đúp với bộ sưu tập lồng nhau

// (1) 
List<Object> myList = new ArrayList<object>(){{ 
    add("Object1"); 
    add("Object2"); 
}}; 

Nhưng tôi muốn có một List của <Map<Object,Object>>:

// (2) 
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>(); 

Làm thế nào tôi có thể sử dụng dấu ngoặc kép khởi tạo (xem (1)) với các bộ sưu tập lồng nhau? Mục tiêu của tôi là khai báo và khởi tạo cấu trúc dữ liệu trong một dòng.

Ngoài ra tôi muốn biết nếu có một số hạn chế nhất định khi sử dụng khởi tạo cú đúp đôi tôi phải nhận thức được.

+2

Chỉ cần sử dụng mã khởi tạo "bình thường"; khởi động cú đúp đôi rất khó đọc. Code là WORM (Write Once, Read Many). Lưu ý: nếu đây là danh sách tĩnh, hãy sử dụng trình khởi tạo tĩnh. – fge

+1

Tại sao bạn muốn viết mã như vậy? Bạn có làm việc một mình không? – kolossus

+4

Không sử dụng "dấu ngoặc kép", bởi vì mỗi khi bạn làm điều đó, bạn đang tạo ra một lớp con vô dụng của ArrayList. –

Trả lời

5

Đó không phải là ý tưởng tốt, bởi vì thật khó để đọc, nhưng bạn có thể làm như sau:

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{ 
        add(new HashMap<Object, Object>() {{ 
         put(key, obj); 
        }}); 
       }}; 
+0

Không chỉ khó đọc mà còn xấu cho buổi biểu diễn. –

+0

@vang: cảm ơn thời gian và câu trả lời của bạn nhưng trong điều này bạn đã không khởi tạo danh sách: ( –

+2

Bạn có ý nghĩa gì? Hơn ArrayList mới >() là gì? – Bracadabra

10

Tránh đôi khởi cú đúp vì nó a) ngạc nhiên các đồng nghiệp của mình và rất khó để đọc, b) hại hiệu suất và c) có thể gây ra vấn đề với bình đẳng đối tượng (mỗi đối tượng được tạo có một đối tượng lớp duy nhất).

Nếu bạn đang làm việc trên hướng dẫn kiểu mã, loại mẹo này thuộc về phần không.

Nếu bạn thực sự muốn có thể tạo danh sách và bản đồ nội tuyến, chỉ cần tiếp tục và tạo một vài phương pháp nhà máy. Có thể trông giống như sau:

List l = Lists.of(
    Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")), 
    Maps.of(new Entry("baz", "foobar")) 
); 

Tuy nhiên, ví dụ của Vangs cho thấy chính xác cú pháp của ví dụ của bạn là khởi tạo đúp đúp.

+1

Mã đúp đúp cũng có thể phát sinh các vấn đề trong thử nghiệm. Làm thế nào bạn sẽ giả xyz nếu nó được khởi tạo tĩnh, ví dụ? – vikingsteve

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