source

Collections.emptyMap()과 새로운 HashMap()의 비교

goodcode 2022. 8. 11. 22:18
반응형

Collections.emptyMap()과 새로운 HashMap()의 비교

할 수 요?Collections.emptyMap()문서에는 컬렉션을 불변하게 하려면 이 방법을 사용할 수 있다고 나와 있습니다.

내가 왜 불변의 빈 컬렉션을 원하겠어?요점이 뭐야?

유효Java에서 항목 #43 -"Return empty arrays or collections, not null"는 빈 하는 예를 줍니다.또, 이러한 컬렉션을 하는 경우도 .emptyList(),emptySet() , , , , 입니다.emptyMap()빈 컬렉션을 가져오려면 Collections 클래스의 메서드를 사용합니다.이러한 컬렉션은 불변이라는 추가적인 이점도 있습니다.항목 #15부터 "Minimize Mutability".

Collections-emptySet-Collections-emptyList-Collections에서

이것은 일종의 프로그래밍 숙어이다.이것은 null 변수를 원하지 않는 사용자를 위한 것입니다.따라서 세트가 초기화되기 전에 빈 세트를 사용할 수 있습니다.

주의: 아래 코드는 예시일 뿐입니다(사용 사례에 따라 변경).

private Set myset = Collections.emptySet();

void initSet() {
   myset = new HashSet();
}
void deleteSet() {
   myset = Collections.emptySet();
}

이러한 방법에는 몇 가지 이점이 있습니다.

  1. 컬렉션의 일반 유형을 명시적으로 입력할 필요가 없기 때문에 더 간결합니다.일반적으로 메서드 호출의 컨텍스트에서 추측할 수 있습니다.

  2. 새로운 오브젝트를 작성하는 번거로움 없이 기존의 비어 있는 불변의 오브젝트를 재사용할 수 있기 때문에 효율이 향상됩니다.이 효과는 일반적으로 매우 미미하지만 때때로(글쎄, 드물게) 중요합니다.

제 개인적인 경험상 API에 파라미터 집합이 필요하지만 제공할 것이 없는 경우 매우 유용합니다.예를 들어 다음과 같은 API가 있으며 늘 참조를 허용하지 않을 수 있습니다.

public ResultSet executeQuery(String query, Map<String, Object> queryParameters);

필요 쿼리가 java.util.Collections.

내가 왜 불변의 빈 컬렉션을 원하겠어?요점이 뭐야?

함께 보면 이상하게 보이는 두 가지 개념이 있습니다.두 개념을 따로따로 취급하는 것이 더 타당합니다.

  • 첫째, 가능한 한 변동 가능한 컬렉션보다는 불변의 컬렉션을 사용하는 것이 좋습니다.불변의 혜택은 다른 에 잘 기록되어 있다.

  • 둘째, null을 Sentinel로 사용하는 것보다 빈 컬렉션을 사용하는 것이 좋습니다.이것은 여기에 잘 설명되어 있다.즉, 훨씬 깨끗하고 알기 쉬운 코드를 사용할 수 있으며 버그를 숨길 수 있는 장소가 줄어듭니다.

따라서 지도를 필요로 하는 코드가 있는 경우 맵의 부재를 나타내기 위해 늘이 아닌 빈 맵을 전달하는 것이 좋습니다.그리고 대부분의 경우 지도를 사용할 때는 불변의 지도를 사용하는 것이 좋습니다.그래서 불변의 빈 지도를 만들 수 있는 편리한 기능이 있는 것입니다.

불변의 지도, 목록, 세트 또는 기타 유형의 컬렉션을 사용하는 경우가 몇 가지 있습니다.

번째이자 거의 틀림없이 가장 중요한 사용 사례는 일련의 결과(또는 목록 또는 지도)를 반환하는 쿼리 또는 계산 결과를 반환할 때마다 불변의 데이터 구조를 사용하는 것을 선호해야 한다는 것입니다.

이 경우, 저는 이러한 불변 버전을 반환하는 것을 매우 선호합니다.이는 계산 결과 세트의 사실 불변성을 훨씬 더 명확하게 반영하기 때문입니다.데이터를 나중에 어떻게 처리하든 쿼리에서 받은 결과 세트는 변경되지 않습니다.

번째 일반적인 사용 사례는 메서드 또는 서비스에 대한 입력으로 인수를 제공해야 하는 경우입니다.입력 컬렉션이 서비스 또는 메서드에 의해 수정될 것으로 예상하지 않는 한(보통 매우 나쁜 설계 아이디어) 가변 컬렉션 대신 불변의 컬렉션을 전달하는 것이 많은 경우 합리적이고 안전한 선택일 수 있습니다.

는 그것을 "가치관례"라고 생각한다.

보다 일반적으로 - 데이터가 모듈 또는 서비스 경계를 넘을 때마다 불변의 데이터 구조를 사용하는 것이 현명합니다.이것에 의해, (불변한) 입출력 상태와 변동 가능한 내부 상태의 차이를 추측하기 쉬워집니다.

이로 인해 매우 유익한 부작용으로 모듈/서비스의 보안 및 나사산 안전성이 향상되고 문제를 보다 깨끗하게 분리할 수 있습니다.

사용해야 하는 또 다른 좋은 이유Collections.empty*()방법은 그들의 현저한 장황함의 부족이다.Java7 이전 시대에는 범용 컬렉션이 있으면 범용 타입의 주석을 곳곳에 뿌려야 했습니다.

다음 두 선언을 비교해 보십시오.

Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();

비교:

Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();

후자는 분명히 두 가지 중요한 방법으로 가독성을 쉽게 얻을 수 있습니다.

  1. 첫 번째 선언에서는 빈 맵의 인스턴스화 전체가 범용 타입 선언의 노이즈에 묻히고 본질적으로 사소한 선언이 필요 이상으로 암호화됩니다.
  2. 두 번째 버전에서는 오른쪽의 범용 타입 주석이 현저하게 부족할 뿐만 아니라 빈 맵에 대해 맵이 초기화되었음을 명확히 밝히고 있습니다.또한, 이 메서드는 불변의 맵을 반환한다는 것을 알고 있기 때문에, 저는 더 쉽게 어디에서 찾을 수 있습니다.fooBarMap를 검색하는 것만으로 비어 있지 않은 다른 값이 할당됩니다./fooBarMap =/.

예를 들어, 참조 공유에서 벗어날 수 있습니다.anew HashMap()etc는 할당된 오브젝트 및 데이터를 보유하기 위한 추가 요소가 필요하지만 불변의 빈 컬렉션 복사본(리스트, 세트, 맵 또는 기타 모든 것)은 하나만 필요합니다.따라서 호출 중인 메서드가 맵을 승인해야 하지만 편집할 필요가 없는 경우 이 옵션을 선택할 수 있습니다.

는 Josh Bloch의 Effective Java를 확인해 볼 것을 제안합니다.이 Java에는 불변의 오브젝트(스레드 안전성 포함)의 매우 훌륭한 속성이 나열되어 있습니다.

이 기능은 다음 값을 반환하는 함수가 있을 때 유용합니다.immutable collection경우에 따라서는 반환할 데이터가 없기 때문에 반환하는 것이 좋습니다.null당신은 돌아올 수 있다emptyMap()

코드를 더 쉽게 만들고NullPointerException

대부분의 경우,constructor새로 만들다empty map근데...Collections methods만드는 데 몇 가지 이점을 제공하다empty map사용.static method java.util.Collections.emptyMap()

  1. 컬렉션의 일반 유형을 명시적으로 입력할 필요가 없기 때문에 더 간결합니다.일반적으로 메서드 호출의 컨텍스트에서 추측할 수 있습니다.

  2. 새로운 오브젝트를 작성하는 번거로움 없이 기존의 비어 있는 불변의 오브젝트를 재사용할 수 있기 때문에 효율이 향상됩니다.이 효과는 일반적으로 매우 미미하지만 때때로(글쎄, 드물게) 중요합니다.

내가 왜 불변의 빈 컬렉션을 원하겠어?요점이 뭐야?

같은 이유로 언젠가 사용할 수 있습니다.사용자가 예외를 발생시키는 Map 인스턴스를 변경하려고 하면 해당 인스턴스를 반환할 수 있습니다.이건 그냥 특별한 경우야 빈 지도.

내가 왜 불변의 빈 컬렉션을 원하겠어?요점이 뭐야?

불변의 객체를 원하는 것과 같은 이유로.그 주된 이유는 여러 스레드가 동일한 오브젝트 인스턴스에 액세스할 수 있고 모든 스레드가 동일한 값을 볼 수 있다는 것을 알고 있으면 밤에 안전하게 잠을 잘 수 있기 때문입니다.컬렉션에 항목이 없는 경우에도 유효한 값을 유지할 수 있습니다.

언급URL : https://stackoverflow.com/questions/14846920/collections-emptymap-vs-new-hashmap

반응형