2012-10-26 4 views
8

Nếu tôi có tuyên bố như sau trong một lớp học nơi Synapse là một loại trừu tượng:Tuyên bố một lĩnh vực Danh sách với từ khóa thức

private final List<Synapse> synapses; 

Liệu final cho phép tôi vẫn có thể thay đổi trạng thái của Synapse đối tượng trong số List, nhưng ngăn tôi thêm các đối tượng Synapse mới vào danh sách? Nếu tôi sai, bạn có thể giải thích những gì final đang thực hiện và khi nào tôi nên sử dụng từ khóa final thay thế.

Trả lời

20

Không, từ khóa cuối cùng không làm cho danh sách hoặc nội dung của danh sách không thay đổi. Nếu bạn muốn có Danh sách không thể thay đổi, bạn nên sử dụng:

List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses); 

Từ khóa cuối cùng sẽ ngăn bạn gán giá trị mới cho biến 'synapses'. Ví dụ, bạn không thể viết:

final List<Synapse> synapses = createList(); 
synapses = createNewList(); 

Bạn có thể, tuy nhiên, hãy viết:

List<Synapse> synapses = createList(); 
synapses = createNewList(); 
+7

Đó là giá trị chỉ ra rằng mặc dù không có gì có thể được thêm vào, gỡ bỏ, hoặc thay thế trong 'unmodifiableList' xây dựng như thế này, các yếu tố của danh sách vẫn có thể có nhà nước của họ đã thay đổi (nếu là có thể thay đổi). Không có gì về việc kê khai danh sách hoặc xây dựng có thể ngăn chặn điều đó. –

+0

Vì vậy, bạn có thể làm: 'Danh sách cuối cùng synapses = createList();' và sau đó làm 'synapses.add (newSynapse())'? Sau đó, nó có nghĩa là 'synapses' không thể trỏ đến bất cứ điều gì khác nhưng danh sách này phải không? –

+0

@ A.Vieira vâng, đúng, miễn là 'synapses' là một đối tượng có thể thay đổi được như ArrayList. –

4

final ngăn bạn khỏi chỉ định lại sau khi bạn đã gán nó một lần - bạn vẫn có thể thêm/xóa các phần tử như bình thường. Bạn có thể đọc thêm về từ khóa finalhere.

2

Bạn vẫn có thể thay đổi, thêm và xóa nội dung của danh sách, nhưng không thể tạo danh sách mới được gán cho biến.

2

Java Language Specification writes:

Một biến thể được khai báo thức. Biến cuối cùng chỉ có thể được gán cho một lần. Khai báo một biến cuối cùng có thể phục vụ như là tài liệu hữu ích mà giá trị của nó sẽ không thay đổi và có thể giúp tránh các lỗi lập trình.

Đây là lỗi biên dịch nếu biến cuối cùng được gán cho trừ khi nó chắc chắn chưa được gán (§16) ngay trước khi gán.

Trống cuối cùng là biến cuối cùng có tuyên bố thiếu trình khởi tạo.

Khi biến cuối cùng được gán, biến này luôn chứa cùng một giá trị. Nếu một biến cuối cùng giữ một tham chiếu đến một đối tượng, thì trạng thái của đối tượng có thể được thay đổi bởi các hoạt động trên đối tượng, nhưng biến sẽ luôn luôn tham chiếu đến cùng một đối tượng.

Do đó, nếu bạn muốn thực hiện đến nỗi tình trạng có thể truy cập thông qua các biến không thay đổi, bạn phải khai báo biến final, sử dụng một danh sách unmodifiable (ví dụ với Collections.unmodifiableList), và làm cho Synapse đối tượng bất biến.

1

Triển khai cuối cùng ngụ ý rằng tham chiếu đối tượng khi được khởi tạo, bản thân tham chiếu không bao giờ có thể thay đổi được nhưng nội dung có thể là tất nhiên. Nó không vi phạm các quy tắc. Bạn đã chỉ định một quy tắc về thay đổi tham chiếu đang hoạt động phù hợp. Nếu bạn muốn các giá trị cũng nên không bao giờ thay đổi bạn nên đi cho danh sách bất biến i.e

List<String> items = Collections.unmodifiableList(Arrays.asList("a", "b", "c")); 

Xem câu hỏi liên quan sau đây.