Trên trang 65 và 66 của Java Concurrency in Practice Brian Goetz liệt kê các mã sau:Làm thế nào để DelegatingVehicleTracker (trang 65 Goetz) trả lại chế độ xem "trực tiếp"?
@ThreadSafe
public class DelegatingVehicleTracker {
private final ConcurrentMap<String, Point> locations;
private final Map<String, Point> unmodifiableMap;
public DelegatingVehicleTracker(Map<String, Point> points) {
locations = new ConcurrentHashMap<String, Point>(points);
unmodifiableMap = Collections.unmodifiableMap(locations);
}
public Map<String, Point> getLocations() {
return unmodifiableMap;
}
public Point getLocation(String id) {
return locations.get(id);
}
public void setLocation(String id, int x, int y) {
if (locations.replace(id, new Point(x, y)) == null)
throw new IllegalArgumentException("invalid vehicle name: " + id);
}
// Alternate version of getLocations (Listing 4.8)
public Map<String, Point> getLocationsAsStatic() {
return Collections.unmodifiableMap(
new HashMap<String, Point>(locations));
}
}
Về lớp này Goetz viết:
" ... phiên bản Delegating [mã trên] Điều này có nghĩa là nếu luồng A gọi getLocations() và chủ đề B sau đó sửa đổi vị trí của một số các điểm , những thay đổi đó được phản ánh trong bản đồ được trả về chủ đề A . "
Bản đồ unmodifiable của Thread A là "sống" theo nghĩa nào? Tôi không thấy những thay đổi của Thread B thông qua các cuộc gọi tới setLocation() sẽ được phản ánh trong unmodifiableMap của Thread A. Điều này có vẻ như trường hợp chỉ khi Thread A xây dựng một thể hiện mới của DelegatingVehicleTracker. Nhưng đã được Thread A để giữ một tham chiếu đến lớp này, tôi không thấy làm thế nào điều này là có thể.
Goetz tiếp tục nói rằng getLocationsAsStatic() có thể được gọi là "chế độ xem không thay đổi của hạm đội được yêu cầu". Tôi bị bối rối. Dường như đối với tôi chính xác là trường hợp ngược lại, một lệnh gọi hàm getLocationsAsStatic() thực sự sẽ trả lại chế độ xem "trực tiếp" và một cuộc gọi đến getLocations(), là lớp không được xây dựng lại, sẽ trả về chế độ xem tĩnh, không thay đổi của đội xe ô tô.
Tôi thiếu gì trong ví dụ này?
Bất kỳ suy nghĩ hoặc quan điểm nào được đánh giá cao!
Cảm ơn Sleiman, và bạn khác cũng; giờ thì tôi đã hiểu. Tôi sẽ đánh vần nó ra cho bản thân mình (sử dụng hy vọng cho người khác): DelegatingVehicleTracker có thể sửa đổi, nhưng các lớp client không thể. Một cuộc gọi đến unmodifiableMap trong mã ví dụ của bạn ở trên sẽ ném một ngoại lệ (tôi đã thử nó ra), nhưng, tất nhiên, chèn vào bản đồ không. UnmodifiableMap giống như một chương trình múa rối nhìn thấy qua một màn hình kính khiến khán giả không can thiệp được. –
@BenWeaver có một thuật ngữ cho phép ẩn dụ bạn vừa mô tả, đó là số –
Cảm ơn, Sleiman! –