빈지도를 만들어야합니다.
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
문제는 위의 코드가 다음과 같은 경고를 생성한다는 것입니다.
유형 안전성 : Map에서 HashMap으로 확인되지 않은 캐스트
이 빈지도를 만드는 가장 좋은 방법은 무엇입니까?
답변
1) 지도를 변경할 수없는 경우 :
Collections.emptyMap()
// or, in some cases:
Collections.<String, String>emptyMap()
컴파일러가 어떤 종류의 Map이 필요한지 자동으로 파악할 수 없을 때 후자를 사용해야합니다 (이를 유형 추론 이라고 함 ). 예를 들어 다음과 같이 선언 된 메소드를 고려하십시오.
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가 지적했듯이 )
부록 : 프로젝트에서 Guava를 사용 하는 경우 다음 대안이 있습니다.
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()
… JEP 269 의 새로운 편의 팩토리 방법 을 사용합니다 . ?
답변
답변
답변
HashMap 인스턴스가 필요한 경우 가장 좋은 방법은 다음과 같습니다.
fileParameters = new HashMap<String,String>();
Map은 인터페이스이기 때문에 빈 인스턴스를 생성하려면이를 인스턴스화하는 클래스를 선택해야합니다. HashMap은 다른 것만 큼 좋아 보이므로 사용하십시오.
답변
하나 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();
}
}
}