Khi nào tôi sử dụng phương thức java Collections singletonMap?


81

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?


3
@skaffman: Đó sẽ là điều tồi tệ của tôi. Lúc đầu, tôi nghĩ OP đang đề cập đến lớp Commons SingletonMapnên tôi đã chỉnh sửa nó. Kể từ đó, tôi đã khôi phục các thay đổi của mình;)
tskuzzy

Câu trả lời:


121

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()singletonList()khá có thể thường xuyên có ích.


12
Tôi sử dụng singletonMap mọi lúc trong DAO sử dụng Mẫu JDBC Tham số Được đặt tên của Spring. Nếu bạn có một câu lệnh select đơn giản như "select foo from bar where id =: barId" thì bạn sẽ cần một bản đồ tham số với một cặp khóa-giá trị duy nhất, barId = 123. Đó là một nơi tuyệt vời để sử dụng singletonMap ().
spaaarky21

1
Nếu bất kỳ API nào lấy bản đồ làm đầu vào và tôi đang sử dụng Collections.singleton (khóa, giá trị), thì tôi đang chuyển bản đồ không thay đổi, điều này có thể không tốt cho API đó, vì có thể API đó thêm nhiều phần tử hơn vào bản đồ này và trong trường hợp này, không thể làm gì được vì nó là bất biến.
AKS

2
@AKS: về lý thuyết là có, nhưng trên thực tế, quyền truy cập chỉ đọc phổ biến hơn nhiều và cần phải rõ ràng từ tài liệu API liệu các mục nhập có được thêm vào bản đồ được truyền dưới dạng tham số hay không.
Michael Borgwardt

@PlabonDutta: Không. Bạn có thể biết được điều này bằng cách thử nó, bằng cách xem tài liệu API hoặc đơn giản bằng cách nghĩ về "singleton" nghĩa là gì.
Michael Borgwardt

15

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.


8

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 ().


4

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 Sethoặc Map.

singletonMap()singletonList()thực sự đã được giới thiệu sau singletonSet()Java 1.3 vì singletonSet()được chứng minh là hữu ích.


2
Không có phương pháp singletonSet (), nó chỉ gọi là singleton ()
Michael Borgwardt

2

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 singletonMapsẽ némUnsupportedOperationException


0

Đâ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, EnumSethoặc EnumMapthườ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.