سؤال

لنفترض أن لدي وظيفة مع توقيع متابع:

Foo[] getSomeFoos() 
{
      //return null         --- option A 
      or 
      //return new Foo[0];  --- option B
}

ما هي الممارسة الموصى بها لإرجاع القيمة التي تشير إلى عدم إرجاع عناصر؟ أي إيجابيات أو سلبيات لكل خيار؟

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

المحلول

إذا كان طريقتك GetSomeFoos() في الواقع "وجدت" عناصر 0 ، ثم يجب أن تعود new Foo[0].

إذا كان هناك نوع من الخطأ ، فيجب عليك رمي Exception.

والسبب هو أن المستخدمين يجب ألا يضطروا إلى البحث عن خالية:

for (Foo f: GetSomeFoos()) {
    // do stuff
}

في الحالة أعلاه ، إذا GetSomeFoos عاد null, ، سيتعين على المستخدم التعامل مع NullPointerException. ولكن ، إذا قمت بإرجاع صفيف فارغ ، فلن يدخل الرمز أبدًا الحلقة ، ولن يتعين على المستخدم التعامل مع استثناء.

نصائح أخرى

ما إذا كان لإرجاع كائن فارغ أو فارغ يعتمد بالكامل على استخدام الطريقة. إذا تم استدعاء هذه الطريقة من قبل عميل وتعرضها كأبي ، فإن استثناء الرمي أفضل ، ولكن إذا تم استخدامه داخل حزمةك ولم يستخدمه العميل مطلقًا ، فسيكون إرجاع NULL على ما يرام.

يعد إرجاع NULL أكثر كفاءة ، نظرًا لأنك تتجنب النفقات العامة لإنشاء صفيف جديد أو كائن جمع. صحيح أنه عليك بعد ذلك إضافة فحص فارغ عند النقطة التي تستخدم فيها إخراج الوظيفة ، ولكن النفقات العامة لذلك (في Java وجميع اللغات تقريبًا) لا تذكر. أعتقد أيضًا أن التحقق من NULL هو عادة جيدة للدخول ، خاصة عند التعامل مع مكتبات الطرف الثالث.

الجانب السلبي هو أنك تجعل الكود أكثر مطوّلة.

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

private static final String[] EMPTY = {};

أو:

private static final List<String> EMPTY = 
    Collections.unmodifiableList(new ArrayList<String>());

أنا أفضل صفر حجم الصفر.

إنه أكثر أمانًا (تجنب NPE) وأسهل (لا حاجة إلى فحص فارغ).

من جافا فعالة (2nd ed) - البند 43: إرجاع المصفوفات الفارغة أو المجموعات ، وليس الفرق

باختصار ، لا يوجد سبب لإرجاع Null من طريقة صفيف أو تجميع بدلاً من إرجاع مجموعة أو مجموعة فارغة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top