Cara terbaik untuk membuat peta kosong di Java

117

Saya perlu membuat peta kosong.

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

Masalahnya adalah bahwa kode di atas menghasilkan peringatan ini: Ketik keselamatan: Tidak dicentang dari Map ke HashMap

Apa cara terbaik untuk membuat peta kosong ini?

JorgeO
sumber
Apa tipe yang Anda nyatakan untuk fileParameters?
jjnguy
Anda mungkin akan mendapatkan ClassCastException juga.
Tom Hawtin - tackline
1
fileParameters harus berupa Map dan bukan HashMap.
Steve Kuo

Jawaban:

241

1) Jika Peta tidak dapat diubah:

Collections.emptyMap()

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

Anda harus menggunakan yang terakhir kadang-kadang ketika kompiler tidak dapat secara otomatis mencari tahu jenis Map yang dibutuhkan (ini disebut tipe inferensi ). Misalnya, pertimbangkan metode yang dideklarasikan seperti ini:

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

Saat meneruskan Map kosong langsung ke sana, Anda harus eksplisit tentang jenisnya:

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

2) Jika Anda ingin dapat mengubah Peta, misalnya:

new HashMap<String, String>()

(seperti yang ditunjukkan oleh tehblanx )


Tambahan : Jika proyek Anda menggunakan Jambu Biji , Anda memiliki alternatif berikut:

1) Peta yang tidak dapat diubah:

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

Memang, tidak ada keuntungan besar di sini dibandingkan dengan Collections.emptyMap(). Dari Javadoc :

Peta ini berperilaku dan bekerja sama dengan Collections.emptyMap(), dan lebih disukai terutama untuk konsistensi dan pemeliharaan kode Anda.

2) Peta yang dapat Anda modifikasi:

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

Mapsberisi metode pabrik serupa untuk membuat instance jenis peta lain juga, seperti TreeMapatau LinkedHashMap.


Pembaruan (2018) : Di Java 9 atau yang lebih baru, kode terpendek untuk membuat peta kosong yang tidak dapat diubah adalah:

Map.of()

... menggunakan metode pabrik praktis baru dari JEP 269 . 😎

Jonik
sumber
Dalam kebanyakan kasus, jenis inferensi berfungsi (mis. Map = Collections.emptyMap () berfungsi)
Sébastien RoccaSerra
Ya benar. Saya mengedit jawabannya menjadi sedikit lebih komprehensif.
Jonik
16

Collections.emptyMap ()

basszero
sumber
Masalahnya adalah bahwa peta ini hanya dapat diterapkan pada objek Peta, bukan pada HashMap
JorgeO
7
Anda harus (umumnya) menghindari mendeklarasikan objek dari tipe spesifiknya dan menggunakan antarmuka (atau induk abstrak) sebagai gantinya. Cobalah untuk menghindari "HashMap <String, String> foo;" dan gunakan "Map <String, String> foo;" sebagai gantinya
TofuBeer
10

Jika Anda membutuhkan instance HashMap, cara terbaik adalah:

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

Karena Map adalah antarmuka, Anda perlu memilih beberapa kelas yang membuat instance-nya jika Anda ingin membuat instance kosong. HashMap tampak sebagus yang lain - jadi gunakan saja itu.

AndreiM
sumber
7

Baik Collections.emptyMap(), atau jika jenis inferensi tidak berfungsi dalam kasus Anda,
Collections.<String, String>emptyMap()

Peter Štibraný
sumber
2

Karena dalam banyak kasus peta kosong digunakan untuk desain yang aman-null, Anda dapat menggunakan nullToEmptymetode utilitas:

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

}  

Demikian pula untuk set:

class SetUtils {

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

}

dan daftar:

class ListUtils {

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

}
Vitalii Fedorenko
sumber