Tôi không hiểu tại sao bạn cần java Collections singletonMap ? Nó có hữu ích trong các ứng dụng đa luồng không?
Tôi không hiểu tại sao bạn cần java Collections singletonMap ? Nó có hữu ích trong các ứng dụng đa luồng không?
Câu trả lời:
Về cơ bản, nó cho phép bạn làm điều này:
callAPIThatTakesAMap(Collections.singletonMap(key, value));
chứ không phải thế này:
Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);
sẽ đẹp hơn nhiều khi bạn chỉ có một cặp khóa / giá trị duy nhất. Tình trạng này có lẽ không xảy ra rất thường xuyên, nhưng singleton()
và singletonList()
khá có thể thường xuyên có ích.
Sẽ rất hữu ích nếu bạn cần chuyển một bản đồ tới một mã chung nào đó (dưới dạng tham số hoặc kết quả từ một phương thức) và bạn biết điều đó trong trường hợp cụ thể này - nhưng có lẽ không phải trong các trường hợp khác chuyển bản đồ đến cùng một mã chung mã - bản đồ bạn muốn vượt qua chỉ có một khóa duy nhất. Trong trường hợp đó, SingletonMap hiệu quả hơn việc triển khai toàn bộ bản đồ và cũng thuận tiện hơn cho lập trình viên vì mọi thứ bạn cần nói đều có thể được nói trong hàm tạo.
Ngoài ra, một triển khai SingletonMap được trả về bởi Collections.singletonMap () có bộ nhớ nhỏ hơn HashMap thông thường. Nó chỉ phải chứa hai trường thành viên: khóa và giá trị, trong khi HashMap duy trì một mảng bên trong các đối tượng Node cộng với các trường thành viên khác. Vì vậy, nếu bạn đang tạo rất nhiều bản đồ này trong bộ nhớ, sẽ là một lựa chọn thận trọng khi sử dụng Collections.singletonMap ().
Nó chủ yếu để thuận tiện và trừu tượng. Một số API lấy một Collection
đối số và thật tuyệt khi có một cách đơn giản để chuyển đổi các đối tượng thành một Set
hoặc Map
.
singletonMap()
và singletonList()
thực sự đã được giới thiệu sau singletonSet()
Java 1.3 vì singletonSet()
được chứng minh là hữu ích.
nhiều câu trả lời cho bạn biết khi nào, nhưng tôi muốn chỉ ra khi nào not use it
đừng sử dụng nó nếu bạn muốn put items later on
,
bởi vì đặt thực hiện singletonMap
sẽ némUnsupportedOperationException
Đây chỉ là một ví dụ khác, nhưng tôi đã viết dòng mã này:
@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}
lưu ý @Override
. Giao diện tổng quát hơn có thể lấy bản đồ của nhiều thứ; sự khởi tạo cụ thể này chỉ luôn trả về một bản đồ chứa một thứ. Cũng lưu ý rằng chìa khóa của bản đồ là một Enum. Vì vậy, các bản đồ không bao giờ được cho là lớn, chúng chỉ được cho là chứa kết quả của bất kỳ hành động nào được chỉ định. Trong ví dụ thực tế của tôi, có tối đa 5 hành động và phần khởi tạo này chỉ sử dụng một trong số chúng.
Để hoàn chỉnh, EnumSet
hoặc EnumMap
thường thích hợp trong những trường hợp này, nhưng những điều đó vẫn còn dài dòng một cách khó chịu so với đoạn mã ở trên.
SingletonMap
nên tôi đã chỉnh sửa nó. Kể từ đó, tôi đã khôi phục các thay đổi của mình;)