2017-06-12 5 views
0

Ich habe diese Erweiterung von ArrayList, NullIgnoringArrayList erstellt, weil es möglich ist, dass meine Anwendung von Zeit zu Zeit Nullen hinzufügt. Ich weiß, dass es verschiedene andere Möglichkeiten gibt, dies zu tun, wie die Überprüfung auf Null, bevor Nullen eingefügt oder ausgefiltert werden, wenn auf die ArrayList zugegriffen wird. Aber ich habe es in meinem Kopf, es so zu machen und es lief gut, aber jetzt weiß ich nicht weiter.Wie implementiere ich ListIterator?

Ich sollte ListIterator implementieren, weil meine Tests diese Methode aufrufen. Ich habe in der Implementierung in ArrayList einen Höhepunkt erreicht, aber dort ist ListItr eine private Klasse, die die privaten Felder von ArrayList verwendet, die ich in NullIgnoringArrayList nicht habe.

Um ehrlich zu sein, könnte ich vielleicht overengineering und vielleicht sollte ich es einfach fallen lassen. Auf der anderen Seite könnte man etwas lernen.

NullIgnoringArrayList:

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

    @Override 
    public boolean add(T element) { 
     return !isNull(element) && super.add(element); 
    } 

    @Override 
    public void add(int index, T element) { 
     if (isNull(element)) { 
      return; 
     } 
     super.add(index, element); 
    } 

    @Override 
    public boolean addAll(Collection c) { 
     return !isNull(c) && super.addAll(c); 
    } 

    @Override 
    public boolean addAll(int index, Collection c) { 
     return !isNull(c) && super.addAll(index, c); 
    } 

    @Override 
    public ListIterator listIterator() { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public ListIterator listIterator(int index) { 
     throw new NotImplementedException(); 
    } 
} 

SimpleListIterator:

public class SimpleListIterator<T> implements ListIterator { 
    @Override 
    public boolean hasNext() { 
     return false; 
    } 

    @Override 
    public Object next() { 
     return null; 
    } 

    @Override 
    public boolean hasPrevious() { 
     return false; 
    } 

    @Override 
    public Object previous() { 
     return null; 
    } 

    @Override 
    public int nextIndex() { 
     return 0; 
    } 

    @Override 
    public int previousIndex() { 
     return 0; 
    } 

    @Override 
    public void remove() { 

    } 

    @Override 
    public void set(Object o) { 

    } 

    @Override 
    public void add(Object o) { 

    } 
} 
+0

Ich bin nicht sehr vertraut mit Java Arraylist, aber Kannst du nicht einfach das vorhandene o benutzen? ne, d. h. die, die ArrayList implementiert? Müssen Sie wirklich Ihre eigenen, schrecklich dysfunktionalen implementieren? –

+1

Es könnte besser sein, stattdessen ['AbstractList'] (https://docs.oracle.com/javase/8/docs/api/java/util/AbstractList.html) zu erweitern. –

Antwort

0

Nur Delegierte Methode ListIterator<T> des Mutter ruft:

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

    ... 

    @Override 
    public ListIterator<T> listIterator() { 
     return new SimpleListIterator<>(super.listIterator()); 
    } 

    @Override 
    public ListIterator<T> listIterator(int index) { 
     return new SimpleListIterator<>(super.listIterator(index)); 
    } 
} 

public class SimpleListIterator<T> implements ListIterator<T> { 

    private final ListIterator<T> underlying; 

    public SimpleListIterator(ListIterator<T> underlying) { 
     this.underlying = underlying; 
    } 

    @Override public boolean hasNext() {return underlying.hasNext();} 
    @Override public T next() { return underlying.next(); } 
    @Override public boolean hasPrevious() {return underlying.hasPrevious();} 
    @Override public T previous() {return underlying.previous();} 
    @Override public int nextIndex() {return underlying.nextIndex();} 
    @Override public int previousIndex() {return underlying.previousIndex();} 
    @Override public void remove() { underlying.remove();} 

    @Override 
    public void set(T o) { 
     if (isNull(o)) {return;} 
     underlying.set(o); 
    } 

    @Override 
    public void add(T o) { 
     if (isNull(o)) {return;} 
     underlying.add(o); 
    } 
} 
+0

Ich habe vergessen zu erwähnen, dass ListIterator seine eigene add-Methode hat, die in diesem Fall auch überschrieben werden musste, um null zu ignorieren. Dieser Vorschlag half mir, dies zu erreichen, ty – progonkpa

Verwandte Themen