2017-06-12 65 views
0

我創建了ArrayList的擴展NullIgnoringArrayList,因爲我的應用程序可能會不時添加空值。我知道有很多其他方法可以解決這個問題,比如在訪問ArrayList時插入或過濾空值之前檢查null。但我認爲這樣做,這樣做很好,但現在我不知道該怎麼做。如何實現ListIterator?

我應該實現ListIterator,因爲我的測試調用了這個方法。我在ArrayList的實現中達到了頂峯,但是ListItr是一個使用ArrayList的私有字段的私有類,我沒有在NullIgnoringArrayList中使用這些私有字段。儘管如此,我可能是過度工程,也許我應該放棄它。另一方面,人們可能會學到一兩件事。

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

我不是很熟悉Java的ArrayList中,但你不能只用現有的o ne,即ArrayList實現的那個?你真的必須實施自己的,非常功能障礙的嗎? –

+1

改爲['AbstractList'](https://docs.oracle.com/javase/8/docs/api/java/util/AbstractList.html)可能會更好。 –

回答

0

只是委託方法調用父的ListIterator<T>

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

我忘了提及ListIterator有它自己的add方法,在這種情況下也需要重寫以忽略null。這個建議幫助我完成了這個,ty – progonkpa