سؤال

لدي طريقة List<Foo> getFoos () الذي يحصل على البيانات من الخادم البعيد ويعيدها.

بالطبع ، يجب ألا يغير المستخدم عدد عناصر القائمة لأنه سيحصل على بيانات غير متزامنة مع البيانات على الخادم (وإذا كان يريد تغيير عدد العناصر ، فإنه لديه أساليب خاصة مثل addFoo ()).

كان النهج الأول هو إرجاع صفيف وتغيير توقيع طريقة إلى Foo[] getFoos (). لكن الأمر أكثر شيوعًا في Java وأكثر ملاءمة للمستخدم للعمل مع المجموعات لذلك قمت بتغيير التوقيع إلى List<Foo> getFoos (). هذه الطريقة تعود دائما

Collections.unmodifiableList (originalList)

لذلك ، عندما يحاول المستخدم تغيير القائمة ، سيحصل على RunTimeException.

هل هناك أي توصيات حول تصميم API في حالات مماثلة؟

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

المحلول

Collections.unmodifiableList مقبول تمامًا ويجب أن يكون أسرع (لا حاجة لإنشاء صفيف).

تحرير - من حيث تصميم API ، يجب عليك فقط توضيح Javadoc الخاص بك! الأشخاص الذين يستخدمون طريقة دون قراءة مستندها يستحقون المفاجأة: P

نصائح أخرى

أود أن أقول أيضًا أنها مقبولة تمامًا وأفضل بكثير من إرجاع مجموعة (التي بعض اقترح يجب أن يعامل كنوع مستهجن تمامًا). إذا كنت تريد أن تكون أكثر وضوحًا في ذلك في واجهة برمجة التطبيقات ، يمكنك التفكير في إرجاع ImmutableList من عند مجموعات جوجل.

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

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

إذا كنت تريد خاصية مخصصة أو متخصصة من كائن موجود ، أو قائمة في هذه الحالة ، فلماذا لا تحاول تمديدها أو احتوائها وجعل الملحقات ذات الصلة لرمي استثناء؟

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

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

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