Tôi thích sử dụng trình khởi tạo tĩnh để tránh tạo các lớp ẩn danh (sẽ không có mục đích nào nữa), vì vậy tôi sẽ liệt kê các mẹo khởi tạo với trình khởi tạo tĩnh. Tất cả các giải pháp / lời khuyên được liệt kê là loại an toàn.
Lưu ý: Câu hỏi không nói bất cứ điều gì về việc làm cho bản đồ không thể thay đổi, vì vậy tôi sẽ bỏ qua nó, nhưng biết rằng nó có thể dễ dàng thực hiện được Collections.unmodifiableMap(map)
.
Mẹo đầu tiên
Mẹo đầu tiên là bạn có thể tạo một tham chiếu cục bộ cho bản đồ và bạn đặt cho nó một tên NGẮN:
private static final Map<Integer, String> myMap = new HashMap<>();
static {
final Map<Integer, String> m = myMap; // Use short name!
m.put(1, "one"); // Here referencing the local variable which is also faster!
m.put(2, "two");
m.put(3, "three");
}
Mẹo thứ hai
Mẹo thứ 2 là bạn có thể tạo một phương thức trợ giúp để thêm các mục; bạn cũng có thể công khai phương thức trợ giúp này nếu bạn muốn:
private static final Map<Integer, String> myMap2 = new HashMap<>();
static {
p(1, "one"); // Calling the helper method.
p(2, "two");
p(3, "three");
}
private static void p(Integer k, String v) {
myMap2.put(k, v);
}
Phương thức trợ giúp ở đây không thể sử dụng lại được vì nó chỉ có thể thêm các phần tử vào myMap2
. Để làm cho nó có thể sử dụng lại, chúng ta có thể biến bản đồ thành một tham số của phương thức trợ giúp, nhưng sau đó mã khởi tạo sẽ không ngắn hơn nữa.
Mẹo thứ ba
Mẹo thứ 3 là bạn có thể tạo một lớp trình trợ giúp giống như trình xây dựng có thể sử dụng lại với chức năng điền. Đây thực sự là một lớp trợ giúp 10 dòng đơn giản, an toàn cho loại:
public class Test {
private static final Map<Integer, String> myMap3 = new HashMap<>();
static {
new B<>(myMap3) // Instantiating the helper class with our map
.p(1, "one")
.p(2, "two")
.p(3, "three");
}
}
class B<K, V> {
private final Map<K, V> m;
public B(Map<K, V> m) {
this.m = m;
}
public B<K, V> p(K k, V v) {
m.put(k, v);
return this; // Return this for chaining
}
}