2013-06-11 23 views
5

Câu hỏi khá tự giải thích. Tôi có một cấu trúc dữ liệu (tôi đã đề cập một HashMap nhưng nó có thể là một Set hoặc một danh sách cũng) mà tôi ban đầu cư:Làm cách nào để cố định một HashMap để ngăn chặn các thay đổi khác?

Map<String, String> map = new HashMap<String, String>(); 

for(something) { 
    map.put(something); 
} 

Sau khi cấu trúc đã được dân cư, tôi không bao giờ muốn thêm hoặc xóa bất kỳ mục:

map.freeze(); 

Làm cách nào để đạt được điều này bằng thư viện Java chuẩn?

+0

Nếu bạn luôn đặt nó trực tiếp sau khi khởi tạo, tại sao không sử dụng khởi tạo tĩnh? [Ở đây] (http://stackoverflow.com/questions/507602/how-to-initialise-a-static-map-in-java) là một ví dụ tốt về cách thực hiện điều đó. – colti

Trả lời

17

Điều tốt nhất bạn có thể thực hiện với thư viện JDK chuẩn là Collections.unmodifiableMap().

Lưu ý rằng bạn phải thả tham chiếu bản đồ gốc, vì tham chiếu đó vẫn có thể được truy cập và thay đổi bình thường. Nếu bạn đã chuyển tham chiếu cũ cho bất kỳ đối tượng nào khác, họ vẫn có thể thay đổi bản đồ của bạn.

Thực hành tốt nhất:

map = Collections.unmodifiableMap(map); 

và chắc chắn rằng bạn không chia sẻ bản gốc map tham khảo.

+4

Không hoàn toàn chính xác. Nếu bạn lo ngại rằng ai đó có thể làm thay đổi bản đồ gốc, bạn có thể tạo một bản sao phòng thủ của nó. 'map - Collections.unmodifiableMap (mới HashMap (map));' Tất nhiên, điều này vẫn để lại câu hỏi liệu có bất kỳ đối tượng nào trong bản đồ có thể thay đổi được không. –

3

Quấn nó trong một lớp học và làm cho nó không thay đổi. Ví dụ:

public class ImmutableMapWrapper { 

    private Map<String, String> map = new HashMap<String, String>(); 

    public ImmutableMapWrapper() { 
     for(something) { 
      this.map.put(something); 
     } 
    } 
} 
0

Tạo một HashMap bất biến:

HashMap <MyKey, MyValue> unmodifiableMap = Collections.unmodifiableMap(modifiableMap); 

javadoc here.

Ngoài ra, tôi nghĩ rằng bộ sưu tập dữ liệu của Google là utils (Guava ???) có loại ImmutableMap rồi.

7

Có vẻ như bạn sẽ làm rất tốt với số ImmutableMap của Guava. Cho phép sử dụng mẫu Builder để lắp ráp và "đóng băng".

+1

Và đây là giải pháp tốt nhất nếu bạn có thể sử dụng thư viện của bên thứ ba. –

+5

Có, nhưng các câu hỏi sẽ hỏi: * Làm cách nào để đạt được điều này bằng cách sử dụng ** thư viện Java chuẩn **? * – arshajii

+6

Đôi khi câu trả lời bạn muốn không phải là câu trả lời bạn cần. – Deadron

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