2011-11-03 36 views
26

Như chúng ta biết mục đích của từ khóa "cuối cùng" trong java. Trong khi khai báo một biến là final, chúng ta phải khởi tạo biến. như "final int a = 10;" Chúng tôi không thể thay đổi giá trị của "a". Nhưng nếu chúng ta đi cho HashTable của nó có thể để thêm một số giá trị thậm chí tuyên bố HashTable là cuối cùng.Tạo Hashtable là kết quả cuối cùng trong java

Ví dụ ::

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() 
{{  put("foo",  1);  
     put("bar",  256);  
     put("data",  3);  
     put("moredata", 27);  
     put("hello", 32);  
     put("world", 65536); }}; 

Bây giờ tôi tuyên bố MYHASH HashTable là cuối cùng. Nếu tôi cố gắng thêm một số yếu tố vào điều này, nó chấp nhận.

MYHASH.put("NEW DATA",  256); 

Bây giờ, "DỮ LIỆU MỚI" được thêm vào HashTable. Câu hỏi của tôi là Tại sao nó cho phép thêm thậm chí tuyên bố của nó là cuối cùng ????

+0

Lưu ý nếu nội dung của bản đồ là có thể thay đổi ('java.util.Date' hoặc' java.awt.Point', nói) sau đó nó vẫn còn có thể thay đổi. –

Trả lời

63

Vì cuối cùng đánh dấu tham chiếu chứ không phải đối tượng. Bạn không thể đặt điểm tham chiếu đó thành bảng băm khác. Nhưng bạn có thể làm bất cứ điều gì với đối tượng đó, bao gồm thêm và xóa mọi thứ.

Ví dụ về int là loại nguyên thủy, không phải là tham chiếu. Cuối cùng có nghĩa là bạn không thể thay đổi giá trị của biến. Vì vậy, với int bạn không thể thay đổi giá trị của biến, ví dụ: làm cho giá trị của int khác nhau. Với tham chiếu đối tượng, bạn không thể thay đổi giá trị của tham chiếu, tức là đối tượng mà nó trỏ đến.

0

Đối với trường và biến, sử dụng final có nghĩa là chúng chỉ có thể được gán một lần. Ngay lập tức hoặc vào một thời điểm nào đó sau này (ví dụ: trong một hàm tạo cho các trường). Điều này không có nghĩa là trường hợp thực tế trở thành bất biến. Một Hashtable là một cấu trúc dữ liệu mà bạn có thể thêm các mục vào, bất kể nó được gán cho một số biến. Chỉ có tài liệu tham khảo là cuối cùng.

6

Hãy thử và bọc Hashtable của bạn bằng bản đồ không thể sửa đổi bằng cách sử dụng Collections.unmodifiableMap(MYHASH ). Điều này sẽ ném ngoại lệ khi bạn cố gắng thay đổi một cái gì đó trong bản đồ, tức là thêm hoặc xóa các mục nhập. (Lưu ý rằng MYHASH sau đó phải thuộc loại Map<String, String> và không Hashtable<String, String>.)

Về từ khóa final: như những người khác đã nói, nó có nghĩa là bạn không thể gán một Hashtable-MYHASH nhưng bản đồ riêng của mình vẫn còn có thể thay đổi. Để thay đổi điều này, bạn phải quấn nó với một số wrapper không thay đổi, như UnmodifiableMap được đề cập ở trên.

12

Chỉ tham chiếu là cuối cùng, tất nhiên các phương pháp của nó có thể được gọi giống như đối với tham chiếu không phải cuối cùng.

Sử dụng Collections.unmodifiableMap(map) để làm cho bản đồ không thể sửa đổi được.

4

Như Joe đã nói, điều này là do final đánh dấu tham chiếu không phải là đối tượng.

Tuy nhiên, bạn có thể làm những gì bạn muốn với Collections.unmodifiableMap (xem here)

8

Bạn có thể sử dụng Collections.unmodifiableMap để có được một wrapper unmodifiable trên bảng băm của bạn.

Ví dụ:

import java.util.*; 
class Test{ 

    public static final Map<String,Integer> MYHASH; 
    static{ 
     Hashtable<String,Integer> tmp = 
      new Hashtable<String,Integer>(); 
     tmp.put("A",65); 
     tmp.put("C",67); 
     MYHASH = Collections.unmodifiableMap(tmp); 
    } 

    public static void main(String[] args){ 

     System.out.println(MYHASH.get("A")); 

     //this will throw 
     //java.lang.UnsupportedOperationException 
     MYHASH.put("B",66);  

    } 

} 
+1

Bạn nhận được +1 của tôi vì bạn rõ ràng không giữ phiên bản có thể thay đổi của bản đồ sắp bị vô tình biến đổi. Có lẽ đã ưa thích giữ bí mật tĩnh 'riêng tư'. Cũng không có điểm trong việc sử dụng 'Hashtable'. –

+0

Cảm ơn bạn! Tôi đã đi với 'Hashtable' cho sự nhất quán với câu hỏi, nhưng tôi đã không nhận thấy 'riêng tư'. – Vlad

+0

Cảm ơn bạn cũng đã giải quyết được vấn đề của tôi. – bean

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