Optional والتدفقات
takeWhile وtoList وmapMulti والمجمّعات المفيدة، والعادات السيئة الموروثة من Java 8.
Optional والتدفقات: الاستخدامات الصحيحة والإساءات الشائعة
وصل Optional وواجهة التدفقات (Streams) معًا في Java 8، وربما كان هذا سوء حظهما. فبعد اكتشافهما في الوقت نفسه، جرى اعتمادهما كأسلوب كتابة لا كأدوات، وكانت النتيجة ظاهرة في كل قاعدة شيفرة تقريبًا. فمن جهة نجد Optional في كل مكان: معاملًا في الدوال، وحقلًا في الكيانات، ومتداخلًا بعضه في بعض، ومُسلسَلًا في واجهات HTTP. ومن جهة أخرى نجد سلاسل تدفقات من ثلاثين سطرًا تحلّ محل حلقة من ستة أسطر، ولن يتمكن أي مُحلِّل أداء (profiler) من تحليلها بشكل مفيد.
المشكلة ليست نظرية. فوجود Optional حقلًا في كيان يكسر التسلسل (serialization) في Java ويتسبب في فشل أطر الاستمرارية (persistence)، لأن Optional لا ينفّذ Serializable — وكان هذا قرارًا صريحًا من مصمميه. واستدعاء optional.get() دون تحقق مسبق يحوّل NullPointerException إلى NoSuchElementException، وهو ما لا يحسّن شيئًا على الإطلاق. أما سلسلة تدفق وُضعت في غير موضعها داخل حلقة ساخنة فتكلّف عدة عمليات تخصيص ذاكرة لكل عنصر، في حين لم تكن حلقة for تخصّص شيئًا. يتناول هذا الدرس الواجهتين مع التفريق بين ما صُمّمتا له وما أُسيء استخدامهما فيه، ثم يعرض الإضافات اللاحقة لـ Java 8.
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش