Java에서 빈지도를 만드는 가장 좋은 방법
-
10-07-2019 - |
문제
빈지도를 만들어야합니다.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
문제는 위의 코드 가이 경고를 생성한다는 것입니다.타입 안전 :지도에서 해시 맵으로 확인되지 않은 캐스트
이 빈지도를 만드는 가장 좋은 방법은 무엇입니까?
해결책
1) 지도가 불변 할 수있는 경우 :
Collections.emptyMap()
// or, in some cases:
Collections.<String, String>emptyMap()
컴파일러가 어떤 종류의 맵 종류를 자동으로 파악할 수 없을 때 때때로 후자를 사용해야합니다 (이것은 입력 유추). 예를 들어, 다음과 같은 선언 된 메소드를 고려하십시오.
public void foobar(Map<String, String> map){ ... }
빈지도를 직접 전달할 때는 다음 유형에 대해 명시해야합니다.
foobar(Collections.emptyMap()); // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine
2) 맵을 수정할 수 있어야하는 경우 예를 들어 :
new HashMap<String, String>()
(처럼 Tehblanx가 지적했다)
부록: 프로젝트가 사용되는 경우 구아바, 당신은 다음과 같은 대안이 있습니다.
1) 불변지도 :
ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()
물론, 여기에는 큰 이점이 없습니다 Collections.emptyMap()
. Javadoc에서:
이 맵은 동작하고 비슷하게 작동합니다
Collections.emptyMap()
주로 코드의 일관성과 유지 가능성에 바람직합니다.
2) 수정할 수있는지도 :
Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()
Maps
다른 유형의 맵을 인스턴스화하기위한 유사한 공장 방법이 포함되어 있습니다. TreeMap
또는 LinkedHashMap
.
업데이트 (2018): 에 Java 9 또는 새롭고 불변의 빈 맵을 만드는 가장 짧은 코드는 다음과 같습니다.
Map.of()
다른 팁
해시 맵 인스턴스가 필요한 경우 가장 좋은 방법은 다음과 같습니다.
fileParameters = new HashMap<String,String>();
맵은 인터페이스이므로 빈 인스턴스를 만들려면 인스턴스화하는 클래스를 선택해야합니다. 해시 맵은 다른 것만 큼 좋아 보인다 - 그래서 그것을 사용하십시오.
어느 하나 Collections.emptyMap()
, 또는 귀하의 경우 유형 추론이 작동하지 않는 경우
Collections.<String, String>emptyMap()
많은 경우 빈 맵이 Null-Safe 설계에 사용되므로 nullToEmpty
유틸리티 방법 :
class MapUtils {
static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) {
if (map != null) {
return map;
} else {
return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of()
}
}
}
유사하게 세트의 경우 :
class SetUtils {
static <T> Set<T> nullToEmpty(Set<T> set) {
if (set != null) {
return set;
} else {
return Collections.<T>emptySet();
}
}
}
및 목록 :
class ListUtils {
static <T> List<T> nullToEmpty(List<T> list) {
if (list != null) {
return list;
} else {
return Collections.<T>emptyList();
}
}
}