لماذا لا تكون التعدادات قابلة للتكرار؟
-
09-06-2019 - |
سؤال
في 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
, ، ليس Iterable
.أ Collection
يكون 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());
}