2010-09-22 35 views
15

Tôi đang tìm một cú pháp nhỏ gọn để khởi tạo bộ sưu tập và thêm một vài mục vào bộ sưu tập đó. Tôi hiện đang sử dụng cú pháp sau:Cú pháp nhỏ gọn để khởi tạo bộ sưu tập khởi tạo

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" })); 

tôi dường như nhớ lại rằng có một cách nhỏ gọn hơn để làm điều này có sử dụng một lớp con nặc danh của ArrayList, sau đó thêm các mục trong lớp con constructor. Tuy nhiên, tôi dường như không thể nhớ cú pháp chính xác.

Trả lời

2

Có lẽ đó là

Collection<String> collection = new ArrayList<String>() {{ 
    add("foo"); 
    add("bar"); 
}}; 

Còn được gọi là double-khung khởi tạo.

8

Tôi đoán bạn đang suy nghĩ về

collection = new ArrayList<String>() { // anonymous subclass 
    { // anonymous initializer 
     add("1"); 
     add("2"); 
     add("3"); 
    } 
} 

đó, một comapcted, mang đến cho

collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }} 

fugly, để nói rằng ít nhất. Tuy nhiên, có một biến thể đối với phương thức Arrays.asList: Arrays.asList(T...a), cung cấp khả năng comapcity và dễ đọc. Ví dụ: nó cung cấp dòng mã sau đây:

collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter 

Và lưu ý bạn không tạo phân lớp ẩn danh của ArrayList sử dụng không rõ ràng.

0

Có lẽ nó chỉ là tôi nhưng tôi không nhìn thấy điểm thứ phức tạp, hoàn toàn trong việc theo đuổi viết ngắn mã/nhanh hơn. Với lựa chọn gõ ít dòng mã hơn và dễ dàng sửa lỗi/sửa lại tôi khá chắc chắn tôi sẽ chọn tùy chọn thứ hai. Vì vậy, trừ khi có một lý do cụ thể để thúc đẩy việc giữ ngắn này, tôi muốn nói đến dao cạo Ockham, và đưa ra một số giải pháp cho một vấn đề, đi với một trong những đơn giản nhất. Bằng cách đó khi một cái gì đó không ổn (mà luật Murphy rõ ràng ra lệnh cho nó sẽ) bạn sẽ có một thời gian dễ dàng hơn nhiều để theo dõi nó. :)

1

Bạn có thể tạo một chức năng tiện ích:

@SafeVarargs 
public static <T> List<T> listOf(T ... values) { 
    return new ArrayList<T>(Arrays.asList(values)); 
} 

Vì vậy, bạn có thể gọi nó như:

collection = MyUtils.listOf("1", "2", "3"); 

Bằng cách đó, bạn có thể cư một danh sách rất dễ dàng, và vẫn giữ nó có thể thay đổi .

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