如何实现ListIterator?
How to implement ListIterator?
我创建了 ArrayList 的这个扩展,NullIgnoringArrayList,因为我的应用程序可能会不时添加空值。我知道有多种其他方法可以处理此问题,例如在插入之前检查 null 或在访问 ArrayList 时过滤掉 null。但我已经想到要这样做,而且一切顺利,但现在我不知道如何进行。
我应该实现 ListIterator,因为我的测试调用了这个方法。我在 ArrayList 内部的实现达到顶峰,但是 ListItr 是一个私有 class,它使用 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();
}
}
简单列表迭代器:
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) {
}
}
只需 委托 方法调用到父级的 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);
}
}
我创建了 ArrayList 的这个扩展,NullIgnoringArrayList,因为我的应用程序可能会不时添加空值。我知道有多种其他方法可以处理此问题,例如在插入之前检查 null 或在访问 ArrayList 时过滤掉 null。但我已经想到要这样做,而且一切顺利,但现在我不知道如何进行。
我应该实现 ListIterator,因为我的测试调用了这个方法。我在 ArrayList 内部的实现达到顶峰,但是 ListItr 是一个私有 class,它使用 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();
}
}
简单列表迭代器:
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) {
}
}
只需 委托 方法调用到父级的 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);
}
}