سؤال

أنا بحاجة إلى إنشاء فارغة الخريطة.

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

المشكلة هي أن رمز أعلاه تنتج هذا التحذير:نوع الأمان:دون رادع المدلى بها من خريطة HashMap

ما هي أفضل طريقة لخلق الفارغة هذه الخريطة ؟

هل كانت مفيدة؟

المحلول

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(). من جافادوك:

هذه الخريطة يتصرف وينفذ نسبيا إلى Collections.emptyMap(), و هو الأفضل أساسا الاتساق والصيانة الخاصة بك التعليمات البرمجية.

2) الخريطة التي يمكنك تعديلها:

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

Maps يحتوي على غرار مصنع طرق إنشاء أنواع أخرى من الخرائط مثل TreeMap أو LinkedHashMap.


تحديث (2018):على جافا 9 أو أحدث أقصر رمز خلق ثابتة فارغة الخريطة:

Map.of()

...استخدام جديدة الراحة أساليب المصنع من JEP 269. 😎

نصائح أخرى

إذا كنت بحاجة إلى مثيل HashMap ، فإن أفضل طريقة هي:

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

منذ الخريطة هو واجهة ، تحتاج إلى اختيار بعض الفئة التي instantiates إذا كنت ترغب في إنشاء مثيل فارغة.HashMap تبدو جيدة مثل أي دولة أخرى - حتى مجرد استخدام ذلك.

إما Collections.emptyMap(), أو إذا كان نوع الاستدلال لا يعمل في الحال ،
Collections.<String, String>emptyMap()

لأنه في كثير من الحالات فارغة تستخدم خريطة null-تصميم آمن, يمكنك الاستفادة من 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