Java'da boş bir harita oluşturmanın en iyi yolu


117

Boş bir harita oluşturmam gerekiyor.

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

Sorun, yukarıdaki kodun bu uyarıyı oluşturmasıdır: Tip güvenliği: Haritadan HashMap'e kontrol edilmemiş atama

Bu boş haritayı oluşturmanın en iyi yolu nedir?


FileParameters için beyan ettiğiniz tür nedir?
jjnguy

Muhtemelen bir ClassCastException da alacaksınız.
Tom Hawtin - tackline

1
fileParameters bir HashMap değil, bir Harita olmalıdır.
Steve Kuo

Yanıtlar:


242

1) Harita değişmez olabilirse:

Collections.emptyMap()

// or, in some cases:
Collections.<String, String>emptyMap()

Bazen, derleyici ne tür bir Haritaya ihtiyaç duyulduğunu otomatik olarak anlayamadığında ikincisini kullanmanız gerekir (buna tür çıkarımı denir ). Örneğin, şu şekilde bildirilmiş bir yöntemi düşünün:

public void foobar(Map<String, String> map){ ... }

Boş Haritayı doğrudan ona iletirken, tür konusunda açık olmanız gerekir:

foobar(Collections.emptyMap());                 // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine

2) Haritayı değiştirebilmeniz gerekiyorsa, örneğin:

new HashMap<String, String>()

( tehblanx'ın işaret ettiği gibi )


Ek : Projeniz Guava kullanıyorsa , aşağıdaki alternatiflere sahipsiniz:

1) Değişmez harita:

ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()

Elbette, burada ile karşılaştırıldığında büyük bir fayda yok Collections.emptyMap(). Javadoc'tan :

Bu harita Collections.emptyMap(), benzer şekilde davranır ve performans gösterir ve esas olarak kodunuzun tutarlılığı ve sürdürülebilirliği için tercih edilir.

2) Değiştirebileceğiniz harita:

Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()

MapsTreeMapveya gibi diğer harita türlerini örneklemek için benzer fabrika yöntemleri içerir LinkedHashMap.


Güncelleme (2018) : Java 9 veya daha yeni sürümlerde, değişmez bir boş harita oluşturmak için en kısa kod:

Map.of()

... yeni kullanılarak kolaylık fabrika yöntemleri gelen Jep 269 . 😎


Çoğu durumda, tür çıkarımı işe
yarar

Evet doğru. Cevabı biraz daha kapsamlı olacak şekilde düzenledim.
Jonik

16

Sorun şu ki, bu harita bir
HashMap'e

7
(Genellikle) belirli türdeki nesneleri bildirmekten kaçınmalı ve bunun yerine arayüzü (veya soyut ebeveyni) kullanmalısınız. "HashMap <String, String> foo;" ve "Map <String, String> foo;" komutunu kullanın bunun yerine
TofuBeer


10

Bir HashMap örneğine ihtiyacınız varsa, en iyi yol şudur:

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

Map bir arayüz olduğundan, boş bir örnek oluşturmak istiyorsanız, onu başlatan bir sınıf seçmeniz gerekir. HashMap diğerleri kadar iyi görünüyor - bu yüzden sadece onu kullanın.


7

Ya Collections.emptyMap(), ya da sizin durumunuzda tür çıkarımı işe yaramazsa,
Collections.<String, String>emptyMap()


2

Çoğu durumda, boş güvenlikli tasarım için boş bir harita kullanıldığından, nullToEmptyyardımcı program yöntemini kullanabilirsiniz :

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

}  

Benzer şekilde setler için:

class SetUtils {

  static <T> Set<T> nullToEmpty(Set<T> set) {
    if (set != null) {
      return set;
    } else {
      return Collections.<T>emptySet();
    }
  }

}

ve listeler:

class ListUtils {

  static <T> List<T> nullToEmpty(List<T> list) {
    if (list != null) {
      return list;
    } else {
      return Collections.<T>emptyList();
    }
  }

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.