ספירה לעומת איטרטור
ישנם מבני נתונים רבים הפועלים כאוספים ב-Java כגון Vectors, Hash טבלאות ומחלקות המטמיעות Java Collections Framework (כלומר HashMap, HashSet, ArrayList, TreeSet, TreeMap, LinkedList, LinkedHashMap ו-LinkedHashSet). ישנן דרכים רבות לחזור על האלמנטים האישיים של האובייקטים ב-Java. Java מספקת שני ממשקים כדי להקל על משימה זו. Enumeration ואיטרטור הם שניים מהממשקים שנמצאים בחבילת java.util המספקים פונקציונליות לספירה דרך רצפים או אובייקטים עם קבוצה של פריטים. המונה הוצג ב-JDK 1.0 ואיטרטור שהוצג ב-JDK 1.2 משכפל כמעט את הפונקציונליות של ה-Enumerator (בתוך מסגרת האוספים).
מה זה ספירה?
Enumeration הוא ממשק ציבורי ב-Java, שהוצג ב-JDK 1.0, המספק את היכולת למנות באמצעות רצפים של אלמנטים. זה נמצא תחת חבילת java.util. כאשר ממשק ה-Enumeration מיושם על ידי אובייקט, אובייקט זה יכול ליצור רצף של אלמנטים. לממשק ספירה יש שתי שיטות. השיטה hasMoreElements() תבדוק אם ספירה זו מכילה יותר אלמנטים וה-nextElement() מחזיר את האלמנט הבא ברצף (אם יש עוד אחד לפחות). במילים אחרות, על ידי קריאה ל-nextElement() ברציפות, המתכנת יכול לגשת לאלמנטים הבודדים בסדרה. לדוגמה, כדי להדפיס את כל הרכיבים ב-Vector v1 באמצעות Enumerator, ניתן להשתמש בקטע הקוד הבא.
Enumeration e=v1.elements();
While(e.hasMoreLements()){
System.out.println(e.nextElement());
}
המונה יכול לשמש גם כדי להגדיר את זרם הקלט לאובייקטי SequenceInputStream.
מהו איטרטור?
Iterator הוא ממשק ציבורי בחבילת Java.util, המאפשר איטרציה דרך אלמנטים של אובייקטי האוספים המיישמים את המסגרת של Collections (כגון ArrayList, LinkedList וכו'). זה הוצג ב-JDK 1.2 והחליף את ה-Enumerator במסגרת Java Collections Framework. לאיטרטור יש שלוש שיטות. השיטה hasNext() בודקת אם נותרו אלמנטים באוסף והשיטה next() מחזירה את האלמנט הבא בסדרה. ניתן להשתמש בשיטה remove() כדי להסיר את האלמנט הנוכחי מהאוסף הבסיסי. לדוגמה, כדי להדפיס את כל הרכיבים ב-Vector v1 באמצעות Iterator, ניתן להשתמש בקטע הקוד הבא.
Iterator i=v1.elements();
While(i.hasNext()){
System.out.println(e.next());
}
מה ההבדל בין ספירה לאיטרטור?
למרות ש-Enumeration ואיטרטור הם שניים מהממשקים שנמצאים בחבילת java.util, המאפשרים איטרציה/ספירה דרך אלמנטים של סדרה, יש ביניהם הבדלים. למעשה, Iterator, שהוצג לאחר ספירה, מחליף את ה-Enumeration במסגרת Java Collections. בניגוד ל-Enumeration, Iterator הוא בטוח לכשל. משמעות הדבר היא ששינויים במקביל (באוסף הבסיסי) אינם מותרים כאשר נעשה שימוש ב-Iterator. זה שימושי מאוד בסביבות מרובות הליכי שרשרת שבהן תמיד קיים סיכון לשינויים במקביל. במקרה של שינוי במקביל, אובייקט Iterator יזרוק ConcurrentModificationException. ל-Iterator יש שמות שיטות קצרים יותר בהשוואה ל-Enumerator. יתר על כן, לאיטרטור יש פונקציונליות נוספת של מחיקת אלמנטים במהלך האיטרציה (מה שלא אפשרי באמצעות Enumerator).לכן, אם יש צורך להסיר אלמנטים מהאוסף, Iterator הוא האפשרות היחידה שניתן לשקול.