2013-06-15 23 views
9

Googled cho nó, tìm thấy rất nhiều mã. Nhưng bất kỳ người trong số họ đã cho tôi những gì tôi muốn. Tôi muốn tạo một mảng bình thường Không thể thay đổi. Tôi đã thử điều này:Có cách nào để tạo một mảng thông thường bất biến trong Java không?

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class test { 

    public static void main(String[] args) { 

     final Integer array[]; 

     List<Integer> temp = new ArrayList<Integer>(); 
     temp.add(Integer.valueOf(0)); 
     temp.add(Integer.valueOf(2)); 
     temp.add(Integer.valueOf(3)); 
     temp.add(Integer.valueOf(4)); 
     List<Integer> immutable = Collections.unmodifiableList(temp); 

     array = immutable.toArray(new Integer[immutable.size()]); 

     for(int i=0; i<array.length; i++) 
      System.out.println(array[i]); 

     array[0] = 5; 

     for(int i=0; i<array.length; i++) 
      System.out.println(array[i]); 

    } 
} 

Nhưng nó không hoạt động, tôi có thể gán 5 thành mảng [0] ... Có cách nào để làm cho mảng này không thay đổi được không?

+1

http://stackoverflow.com/questions/3700971/immutable-array-in-java –

+3

Không giống như C, bạn không thể. Tuy nhiên bạn có thể sử dụng một wrapper. – johnchen902

+3

Làm cho bạn biến mảng cuối cùng chỉ ngăn cản việc gán một mảng mới cho nó. Theo như tôi biết không có cách nào để làm cho nó là giá trị cuối cùng. –

Trả lời

5

Nếu bạn muốn sử dụng nó làm mảng, bạn không thể.

Bạn phải tạo một wrapper cho nó, vì vậy mà bạn ném một ngoại lệ trên, nói rằng, .set(), nhưng không có số lượng gói xung quanh sẽ cho phép bạn ném một ngoại lệ trên:

array[0] = somethingElse; 

Tất nhiên, bất biến của các yếu tố là một vấn đề khác hoàn toàn!

LƯU Ý: ngoại lệ tiêu chuẩn để ném cho các hoạt động không được hỗ trợ được đặt tên là UnsupportedOperationException; vì nó được bỏ chọn, bạn không cần khai báo nó trong mệnh đề throws của phương thức của bạn.

3

Không thể với các mảng nguyên thủy.

Bạn sẽ phải sử dụng Collections.unmodifiableList() như bạn đã làm trong mã của mình.

1

Bạn cũng có thể sử dụng Guava's ImmutableList, triển khai Danh sách truy cập ngẫu nhiên, không thể thay đổi được, không cho phép các phần tử rỗng. Không giống như Collections.unmodifiableList(java.util.List), là chế độ xem của một bộ sưu tập riêng biệt mà vẫn có thể thay đổi, một thể hiện của ImmutableList chứa dữ liệu riêng tư của nó và sẽ không bao giờ thay đổi.

+0

Tuy nhiên, OP cho biết" kết quả cuối cùng "không được là' Bộ sưu tập' .. Nếu không, vâng, hòn đá 'không thể thay đổi' của ổi. – fge

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