자바에서 빈지도를 만드는 가장 좋은 방법


117

빈지도를 만들어야합니다.

if (fileParameters == null)
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;

문제는 위의 코드가 다음과 같은 경고를 생성한다는 것입니다. 유형 안전성 : Map에서 HashMap으로 확인되지 않은 캐스트

이 빈지도를 만드는 가장 좋은 방법은 무엇입니까?


fileParameters에 대해 선언 된 유형은 무엇입니까?
jjnguy

아마도 ClassCastException도 발생할 것입니다.
Tom Hawtin-tackline

1
fileParameters는 HashMap이 아닌 Map이어야합니다.
Steve Kuo

답변:


241

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 의 새로운 편의 팩토리 방법 을 사용합니다 . 😎


대부분의 경우 유형 추론 작업 (예 : map = Collections.emptyMap () 작업)
Sébastien RoccaSerra

네, 사실입니다. 나는 좀 더 포괄적으로 대답을 편집했습니다.
Jonik

16

문제는이 맵이 HashMap이 아닌 Map 객체에만 적용될 수 있다는 것입니다
JorgeO

7
(일반적으로) 특정 유형의 객체 선언을 피하고 대신 인터페이스 (또는 추상 부모)를 사용해야합니다. "HashMap <String, String> foo;"를 피하십시오. "Map <String, String> foo;"를 사용합니다. 대신
TofuBeer


10

HashMap 인스턴스가 필요한 경우 가장 좋은 방법은 다음과 같습니다.

fileParameters = new HashMap<String,String>();

Map은 인터페이스이기 때문에 빈 인스턴스를 생성하려면이를 인스턴스화하는 클래스를 선택해야합니다. HashMap은 다른 것만 큼 좋아 보이므로 사용하십시오.


7

하나 Collections.emptyMap()또는 형식 유추가 귀하의 경우에는 작동하지 않을 경우,
Collections.<String, String>emptyMap()


2

대부분의 경우 빈 맵이 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();
    }
  }

}

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