سؤال

في Java 5 وما فوق، لديك حلقة foreach، والتي تعمل بطريقة سحرية على أي شيء يتم تنفيذه Iterable:

for (Object o : list) {
  doStuff(o);
}

لكن، Enumerable لا يزال لا ينفذ Iterable, ، وهذا يعني أن للتكرار على Enumeration يجب عليك القيام بما يلي:

for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}

هل يعرف أحد إذا كان هناك سبب لذلك Enumeration لا يزال لا ينفذ Iterable?

يحرر: للتوضيح، أنا لا أتحدث عن مفهوم اللغة التعداد, ، أنا أتحدث عن فئة خاصة بـ Java في Java API تسمى "تعداد'.

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

المحلول

لم يتم تعديل التعداد لدعم Iterable لأنه واجهة وليست فئة محددة (مثل Vector، الذي تم تعديله لدعم واجهة المجموعات).

إذا تم تغيير التعداد لدعم Iterable فسيؤدي ذلك إلى كسر مجموعة من أكواد الأشخاص.

نصائح أخرى

باعتبارها سهلة و ينظف طريقة استخدام التعداد مع حلقة for المحسنة، قم بالتحويل إلى ArrayList باستخدام java.util.Collections.list.

for (TableColumn col : Collections.list(columnModel.getColumns()) {

(javax.swing.table.TableColumnModel.getColumns يُرجع التعداد.)

لاحظ أن هذا قد يكون أقل كفاءة قليلاً.

لا معنى له Enumeration لتنفيذ Iterable. Iterable هي طريقة المصنع ل Iterator. Enumeration مماثل ل Iterator, ، ويحافظ على الحالة لتعداد واحد فقط.

لذلك، كن حذرا في محاولة التفاف Enumeration ك Iterable.إذا مر بي أحد Iterable, ، سأفترض أنه يمكنني الاتصال iterator() عليه مرارا وتكرارا، وخلق أكبر عدد ممكن Iterator الحالات كما أريد، والتكرار بشكل مستقل على كل منهما.ملفوفة Enumeration لن تفي بهذا العقد؛لا تدع ملفوفة الخاص بك Enumeration الهروب من التعليمات البرمجية الخاصة بك.(جانبا، لاحظت أن Java 7's DirectoryStream ينتهك التوقعات بهذه الطريقة فقط، ولا ينبغي السماح له "بالهروب" أيضًا.)

Enumeration هو مثل Iterator, ، ليس IterableCollection يكون Iterable.ان Iterator ليس.

لا يمكنك فعل هذا:

Vector<X> list = …
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}

لذلك لن يكون من المنطقي القيام بذلك:

Vector<X> list = …
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}

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

تعداد AFAIK هو نوعاً ما "مرفوض":

يأخذ Iterator مكان التعداد في إطار مجموعات Java

آمل أن يقوموا بتغيير Servlet API باستخدام JSR 315 لاستخدام Iterator بدلاً من Enumeration.

إذا كنت ترغب فقط في أن تكون أكثر نظافة من الناحية النحوية، فيمكنك استخدام:

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top