2012-02-14 33 views
19

Tôi đang tạo một ArrayList đối tượng. Tiếp theo là mãKhai báo đối tượng ArrayList là đối tượng cuối cùng để sử dụng trong tệp hằng số

ArrayList someArrayList = new ArrayList(); 

Public ArrayList getLotOfData() 
{ 
ArrayList someData = new ArrayList(); 
return someData; 
} 


someArrayList = eDAO.getLotOfData(); 

Khi tôi đã có đối tượng ArrayList này "someArrayList", tôi xin tuyên bố công khai và chính thức và lưu nó trong một tập tin Constants để nó có thể được truy cập trên toàn cầu. Có cách nào tôi có thể làm điều đó không? Nếu tôi khai báo một đối tượng Arraylist là public và final, thì tôi sẽ không thể gán lại bất kỳ giá trị nào cho nó. Tôi đã thử các sau

public final ArrayList anotherArrayList = new ArrayList(); 

anotherArrayList.addAll(someArrayList); 

Tôi đã hy vọng để lưu trữ này "anotherArrayList" như một đối tượng ArrayList toàn cầu và sử dụng nó, nhưng điều này trả về một ngoại lệ nullpointer. Tôi muốn sử dụng nó giống như một hằng số String "ConstantsFile.anotherArrayList". Bất kỳ ý tưởng ???

+0

ai đó có thể vui lòng chỉnh sửa này? –

+3

Bạn thực sự hơi bối rối; tuyên bố một biến cuối cùng có nghĩa là bạn không thể đặt tham chiếu đến cái gì khác, không phải là bạn không thể thêm các đối tượng vào nó. –

+0

@Dave ... Tôi cũng ngạc nhiên là tại sao điều này trả về một ngoại lệ nullpointer – Raghu

Trả lời

15

Guava cung cấp ImmutableList cho chỉ là về lý do này. (Ngoài ra, nó không có chi phí không gian không cần thiết mà ArrayList phân bổ để nhường chỗ cho các yếu tố trong tương lai mà bạn sẽ không thêm cho ứng dụng của mình.)

public static final ImmutableList<String> CONSTANTS = 
    ImmutableList.of("foo", "bar"); 
56

Bạn có thể dễ dàng làm cho nó public static final, nhưng điều đó sẽ không ngăn mọi người thay đổi nội dung .

Cách tiếp cận tốt nhất là xuất bản một cách an toàn các "liên tục" theo:

  • gói nó trong một danh sách unmodifiable
  • sử dụng một khối dụ để cư nó

Hệ quả là một tuyên bố cuối cùng gọn gàng với việc khởi tạo:

public static final List<String> list = Collections.unmodifiableList(
    new ArrayList<String>() {{ 
     add("foo"); 
     add("bar"); 
     // etc 
    }}); 

hay, phong cách tương tự nhưng khác nhau cho các yếu tố đơn giản (không cần mã)

public static final List<String> list = 
    Collections.unmodifiableList(Arrays.asList("foo", "bar")); 
+0

tôi sử dụng Java 1.4 ..... vì vậy không thể sử dụng các bộ sưu tập tham số – Raghu

+2

sau đó loại bỏ các đánh máy - nó vẫn sẽ làm việc – Bohemian

+2

@ Raghu Có gì lớn? Chỉ cần thả phần ''! – adarshr

13

Java 1.4 cách tương thích:

public static final List STRINGS = Collections.unmodifiableList(
    Arrays.asList(new String[] {"foo", "bar"})); 

Danh sách như vậy là unmodifiable, kêu gọi các phương pháp như add(), remove() hoặc set() sẽ gây ra UnsupportedOperationException.

Đối với phiên bản Java ít cổ:

public static final List<String> STRINGS = Collections.unmodifiableList(
    Arrays.asList("foo", "bar")); 

Và cuối cùng, Java 9 đi kèm với:

public static final List<String> STRINGS = List.of("foo", "bar"); 
Các vấn đề liên quan