Недостатком подхода Дона является то, что он простирается от ArrayList
. Пока это может быть достаточно, но что произойдет, если вы захотите использовать другую реализацию List
? Вы можете создать NoNullsLinkedList
и NoNullsCopyOnWriteArrayList
и т. Д., Но затем вы получите кучу маленьких классов, которые отличаются только по своему предложению extends
. Возможно, лучше создать оболочку List
, которая не принимает нулевые значения. Например:
public class NonNullList<E> extends AbstractList<E> {
private final List<E> delegate;
public NonNullList(List<E> delegate) {
this.delegate = delegate;
}
@Override
public E get(int index) {
return delegate.get( index );
}
@Override
public int size() {
return delegate.size();
}
@Override
public E set(int index, E element) {
return delegate.set( index, element );
}
@Override
public void add(int index, E element) {
if( element != null ) {
delegate.add( index, element );
}
}
@Override
public E remove(int index) {
return delegate.remove( index );
}
}
Это больше кода, но теперь у вас есть возможность выбора реализации List
при создании объекта.
Возможная проблема заключается в том, что вы все еще можете вставить null
s в базовый объект List
. Подход Дона не имеет такого же ограничения.