Java Collections singletonMap 메소드는 언제 사용합니까?


81

Java Collections singletonMap 이 필요한 이유를 이해할 수 없습니까? 다중 스레드 응용 프로그램에서 유용합니까?


3
@skaffman : 그건 내 나쁜 것입니다. 처음에는 OP가 Commons 클래스를 참조한다고 생각하여 SingletonMap편집했습니다. 나는 이후 변경 사항을 롤백했습니다;)
tskuzzy

답변:


121

기본적으로 다음과 같이 할 수 있습니다.

callAPIThatTakesAMap(Collections.singletonMap(key, value));

이보다는 :

Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);

키 / 값 쌍이 하나 뿐인 경우 훨씬 더 좋습니다. 이러한 상황은 아마 매우 자주 발생하지 않지만, singleton()그리고 singletonList()매우 자주 유용 할 수 있습니다.


12
저는 Spring의 Named Parameter JDBC Template을 사용하는 DAO에서 항상 singletonMap을 사용합니다. "select foo from bar where id = : barId"와 같은 간단한 select 문이있는 경우 단일 키-값 쌍인 barId = 123이있는 매개 변수 맵이 필요합니다. singletonMap ()을 사용하기에 좋은 곳입니다.
spaaarky21

1
API가 맵을 입력으로 사용하고 Collections.singleton (key, value)을 사용하는 경우 해당 API가이 맵에 더 많은 요소를 추가 할 수 있으므로 해당 API에 좋지 않을 수있는 변경 불가능한 맵을 전달합니다. 이 경우 변경 불가능하므로 아무것도 할 수 없습니다.
AKS

2
@AKS : 이론적으로는 그렇습니다. 그러나 실제로는 읽기 전용 액세스가 훨씬 더 일반적이며 매개 변수로 전달 된 맵에 항목이 추가되는지 여부는 API 문서에서 명확해야합니다.
Michael Borgwardt 2013-08-20

@PlabonDutta : 아니요. 시도해 보거나 API 문서를 보거나 단순히 "싱글 톤"이 무엇을 의미하는지 생각함으로써 알 수있었습니다.
Michael Borgwardt

15

일반적인 코드 (매개 변수 또는 메소드의 결과)에 맵을 전달해야하고이 특정 경우에 맵을 전달해야하는 경우에 유용합니다. 코드-전달하려는지도에는 키가 하나만 있습니다. 이 경우 SingletonMap은 본격적인지도 구현보다 효율적이며, 말해야하는 모든 내용을 생성자에서 말할 수 있기 때문에 프로그래머에게 더 편리합니다.


8

또한 Collections.singletonMap ()에 의해 반환 된 SingletonMap 구현은 일반 HashMap보다 메모리 공간이 더 작습니다. 키와 값이라는 두 개의 멤버 필드 만 포함하면되는 반면 HashMap은 Node 개체와 다른 멤버 필드의 내부 배열을 유지합니다. 따라서 메모리에 이러한 맵을 많이 생성하는 경우 Collections.singletonMap ()을 사용하는 것이 현명한 선택이 될 것입니다.


4

주로 편의성과 추상화를위한 것입니다. 일부 API는를 Collection인수로 사용하며 객체를 Set또는 Map.

singletonMap()그리고 singletonList()이후에 실제로 도입 된 singletonSet()자바 1.3에 있기 때문에이 singletonSet()유용하다는 것을 증명했다.


2
더 singletonSet () 메소드가 없다, 그것은 단지 () 싱글라고
마이클 Borgwardt

2

많은 답변이 언제 알려졌지만 언제 not use it

원하는 경우 사용하지 마십시오put items later on .

의 구현을 넣어서 singletonMap던지기 때문에UnsupportedOperationException


0

이것은 또 다른 예이지만 다음 코드 줄을 작성했습니다.

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}

주의 @Override. 인터페이스는보다 일반적으로 여러 가지지도를 가져올 수 있습니다. 이 특정 인스턴스화는 항상 한 가지를 포함하는 맵을 반환합니다. 또한 맵의 키는 Enum입니다. 따라서 맵은 절대 크지 않아야하며 지정된 작업의 결과를 포함하기 만하면됩니다. 내 실제 예제에는 최대 5 개의 작업이 있으며이 인스턴스화는 그중 하나만 사용합니다.

완전 EnumSet하거나 EnumMap종종 이러한 경우에 적합하지만 위 코드에 비해 여전히 성가신 장황합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.