Tôi chỉ cần đọc một số mã được viết bởi một lập trình viên có kinh nghiệm hơn, và tôi đi qua như sau:Tại sao tạo danh sách cuối cùng riêng tư/Bộ/Bản đồ không thể sửa đổi?
public class ConsoleFormatter extends Formatter {
private static final Map<Level, String> PREFIXES;
static {
Map<Level, String> prefixes = new HashMap<Level, String>();
prefixes.put(Level.CONFIG, "[config]");
prefixes.put(Level.FINE, "[debug]");
prefixes.put(Level.FINER, "[debug]");
prefixes.put(Level.FINEST, "[trace]");
prefixes.put(Level.INFO, "[info]");
prefixes.put(Level.SEVERE, "[error]");
prefixes.put(Level.WARNING, "[warning]");
PREFIXES = Collections.unmodifiableMap(prefixes);
}
// ...
}
Như bạn có thể thấy, đây là một lớp học sử dụng cho đầu ra định dạng log. Tuy nhiên, điều khiến tôi chú ý là mã trong khối khởi tạo tĩnh: PREFIXES = Collections.unmodifiableMap(prefixes);
.
Tại sao PREFIXES
tạo bản đồ không thể sửa đổi? Đó là một hằng số riêng tư, do đó không có nguy cơ sửa đổi dữ liệu bên ngoài lớp đó. Nó đã được thực hiện để cung cấp cho bất biến của liên tục một cảm giác hoàn chỉnh?
Cá nhân, tôi đã trực tiếp khởi tạo PREFIXES
làm HashMap
và sau đó put
các cặp khóa-giá trị trực tiếp, mà không tạo bản đồ giả, giữ chỗ hoặc làm cho trường trở thành bản đồ bất biến. Am i thiếu cái gì ở đây?
Nó cũng có thể là _thought_ để ngăn chặn các vấn đề khởi tạo đồng thời khi khởi tạo lớp, vì việc gán một bước cho PREFIXES của toàn bộ dữ liệu. –