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

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

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


답변


답변

Collections 클래스의 emptyMap 메소드 .


답변

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();
    }
  }

}


답변