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?


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 . 😎


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

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.


7

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


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

}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.