نمط تصميم المحول | المحول الذي يحول التكرار إلى تعداد

StackOverflow https://stackoverflow.com/questions/1351763

  •  20-09-2019
  •  | 
  •  

سؤال

كجزء من التمرين ، أقوم بتنفيذ قائمة ArrayList التي ستدعم التعدادات.

فيما يلي المحول الذي يحول التكرار إلى التعداد:

public class MyEnumeratorAdapter<Object> implements Enumeration<Object> {

    private Iterator<Object> adaptee;

    public MyEnumeratorAdapter(Iterator<Object> it) {
        this.adaptee = it;
    }

    @Override
    public boolean hasMoreElements() {
        return adaptee.hasNext();
    }

    @Override
    public Object nextElement() {
        return adaptee.next();
    }

}

وفصل ArrayList الخاص بي هو:

public class MyArrayList<Object> extends ArrayList<Object> {

    public MyArrayList() {
        this.enumerator = new MyEnumeratorAdapter<Object>(this.iterator());
    }

    public Enumeration<Object> enumerator() {
        return this.enumerator;

    }

    public boolean hasMoreElements() {
        return this.enumerator.hasMoreElements();
    }

    public Object nextElement() {
        return this.enumerator.nextElement();
    }

    private static final long serialVersionUID = 1L;

    private Enumeration<Object> enumerator;

}

ومع ذلك ، عندما أحاول هذا الاختبار مع الكود التالي ، أحصل على java.util.concurrentModificationException

public static void main(String[] args) {
        MyArrayList<String> names = new MyArrayList<String>();
        names.add("jim");
        names.add("jack");
        names.add("jai");

        for (Enumeration<String> iterator = names.enumerator(); iterator
                .hasMoreElements();) {
            String name = (String) iterator.nextElement();
            System.out.println(name);
        }

    }

ما الخطأ الذي أفعله؟

هل يمكنني الحصول على فئة ArrayList تدعم التعدادات؟

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

المحلول

MyArrayList لديه العديد من القضايا:

  1. يخلق Iterator على قائمة صفيف الصفر ؛ يجب عليك إنشاء تكرار جديد في كل مرة تتصل فيها بالتعداد
  2. ينفذ طريقة التعداد مباشرة في MyArrayList
  3. لا يستخدم الأدوية بشكل صحيح

يجب على هذا الفصل إصلاح هذه المشكلات:

public class MyArrayList<T> extends ArrayList<T> {

    public Enumeration<T> enumerator() {
        return new MyEnumeratorAdapter(this.iterator());
    }
}

نصائح أخرى

ينتهي بك المطاف باستخدام نفس الشيء Iterator مرارا وتكرارا. تحتاج إلى واحدة جديدة في كل مرة (عن طريق إنشاء جديد Enumeration كل مرة).

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