문제

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

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

... 새로운 것을 사용합니다 편의 공장 방법 ~에서 JEP 269. 😎

다른 팁

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

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

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top