仅Java列表添加不删除

仅Java列表添加不删除,java,collections,Java,Collections,我想知道我们是否有可能创建一个Java.util.List,它只允许添加元素,但不允许删除元素 我想到的一种方法是重写remove方法。请建议。您可以扩展现有的列表实现类并覆盖所有公共删除方法,但要覆盖的方法很多(可能更多,下面是我快速找到的所有方法) 公共类UnDeletableList扩展了ArrayList{ @凌驾 公共E删除(int索引){ 抛出新的UnsupportedOperationException(“不从此列表中删除”); } @凌驾 公共布尔删除(对象o){ 抛出新的Uns

我想知道我们是否有可能创建一个Java.util.List,它只允许添加元素,但不允许删除元素


我想到的一种方法是重写remove方法。请建议。

您可以扩展现有的列表实现类并覆盖所有公共删除方法,但要覆盖的方法很多(可能更多,下面是我快速找到的所有方法)

公共类UnDeletableList扩展了ArrayList{
@凌驾
公共E删除(int索引){
抛出新的UnsupportedOperationException(“不从此列表中删除”);
}
@凌驾
公共布尔删除(对象o){
抛出新的UnsupportedOperationException(“不从此列表中删除”);
}
@凌驾
公共布尔removeAll(集合o){
抛出新的UnsupportedOperationException(“不从此列表中删除”);
}
@凌驾
公共布尔保留(集合o){
抛出新的UnsupportedOperationException(“不从此列表中删除”);
}
@凌驾
公共空间清除(){
抛出新的UnsupportedOperationException(“不从此列表中删除”);
}
//如果特别严格,可选择
@凌驾
公共void replaceAll(一元运算符u){
抛出新的UnsupportedOperationException(“不从此列表中删除”);
}
@凌驾
公共E集(int i,E){
抛出新的UnsupportedOperationException(“不从此列表中删除”);
}
}

这可以通过使用Decorator模式来实现。通过这种方式,它可以应用于实现
列表的所有容器:

private static class UnremovableList<E> implements  List<E> {
    private List<E> innerContainer;

    public UnremovableList(List<E> original) {
        innerContainer = original
    }

    @Override
    public void add(int location, E object) {
        innerContainer.add(location, object);
    }

    @Override
    public boolean add(E object) {
        return innerContainer.add(object);
    }

    @Override
    public boolean addAll(int location, Collection<? extends E> collection) {
        return innerContainer.addAll(location, collection);
    }

    @Override
    public boolean addAll(Collection<? extends E> collection) {
        return innerContainer.addAll(collection);
    } - 

    @Override
    public void clear() {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean contains(Object object) {
        return innerContainer.contains(object);
    }

    @Override
    public boolean containsAll(Collection<?> collection) {
        return innerContainer.containsAll(collection);
    }

    @Override
    public E get(int location) {
        return innerContainer.get(location);
    }

    @Override
    public int indexOf(Object object) {
        return innerContainer.indexOf(object);
    }

    @Override
    public boolean isEmpty() {
        return innerContainer.isEmpty();
    }

    @NonNull
    @Override
    public ListIterator<E> listIterator() {
        return listIterator(0);
    }

    @NonNull
    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            Iterator<E> iterator = innerContainer.iterator();

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

            @Override public E next() {
                return iterator.next();
            }

            @Override public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    @Override
    public ListIterator<E> listIterator(final int location) {
        return new ListIterator<E>() {
            ListIterator<E> iterator = innerContainer.listIterator(location);

            @Override public void add(E object) {
                throw new UnsupportedOperationException();
            }

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

            @Override public boolean hasPrevious() {
                return iterator.hasPrevious();
            }

            @Override public E next() {
                return iterator.next();
            }

            @Override public int nextIndex() {
                return iterator.nextIndex();
            }

            @Override public E previous() {
                return iterator.previous();
            }

            @Override public int previousIndex() {
                return iterator.previousIndex();
            }

            @Override public void remove() {
                throw new UnsupportedOperationException();
            }

            @Override public void set(E object) {
                throw new UnsupportedOperationException();
            }
        };
    }

    @Override
    public int lastIndexOf(Object object) {
        return innerContainer.lastIndexOf(object);
    }

    @Override
    public E remove(int location) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean remove(Object object) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean removeAll(Collection<?> collection) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean retainAll(Collection<?> collection) {
        throw new UnsupportedOperationException();
    }

    @Override
    public E set(int location, E object) {
        return innerContainer.set(location, object);
    }

    @Override
    public int size() {
        return innerContainer.size();
    }

    @NonNull
    @Override
    public List<E> subList(int start, int end) {
        return new UnremovableList(innerContainer.subList(start, end));
    }

    @NonNull
    @Override
    public Object[] toArray() {
        return innerContainer.toArray();
    }

    @NonNull
    @Override
    public <T> T[] toArray(T[] array) {
        return innerContainer.toArray(array);
    }
}
private静态类UnremovableList实现列表{
私有列表容器;
公共不可移动列表(列表原件){
innerContainer=原始
}
@凌驾
公共void添加(int位置,E对象){
添加(位置、对象);
}
@凌驾
公共布尔添加(E对象){
返回innerContainer.add(对象);
}
@凌驾
公共布尔addAll(int位置,集合){
返回innerContainer.containsAll(收集);
}
@凌驾
公共E get(int位置){
返回innerContainer.get(位置);
}
@凌驾
public int indexOf(对象){
返回innerContainer.indexOf(对象);
}
@凌驾
公共布尔值为空(){
返回innerContainer.isEmpty();
}
@非空
@凌驾
公共ListIterator ListIterator(){
返回listIterator(0);
}
@非空
@凌驾
公共迭代器迭代器(){
返回新的迭代器(){
迭代器迭代器=innerContainer.Iterator();
@重写公共布尔值hasNext(){
返回iterator.hasNext();
}
@覆盖公共E next(){
返回iterator.next();
}
@覆盖公共void remove(){
抛出新的UnsupportedOperationException();
}
};
}
@凌驾
公共ListIterator ListIterator(最终int位置){
返回新的ListIterator(){
ListIterator迭代器=innerContainer.ListIterator(位置);
@覆盖公共无效添加(E对象){
抛出新的UnsupportedOperationException();
}
@重写公共布尔值hasNext(){
返回iterator.hasNext();
}
@重写公共布尔值hasPrevious(){
返回迭代器.hasPrevious();
}
@覆盖公共E next(){
返回iterator.next();
}
@重写公共int-nextIndex(){
返回迭代器.nextIndex();
}
@覆盖公共E-previous(){
返回迭代器.previous();
}
@重写公共int-previousIndex(){
返回迭代器.previousIndex();
}
@覆盖公共void remove(){
抛出新的UnsupportedOperationException();
}
@替代公共无效集(E对象){
抛出新的UnsupportedOperationException();
}
};
}
@凌驾
public int lastIndexOf(对象){
返回innerContainer.lastIndexOf(对象);
}
@凌驾
公共E删除(内部位置){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔删除(对象){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔removeAll(集合){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔保留(集合集合){
抛出新的UnsupportedOperationException();
}
@凌驾
公共E集(int位置,E对象){
返回innerContainer.set(位置、对象);
}
@凌驾
公共整数大小(){
返回innerContainer.size();
}
@非空
@凌驾
公共列表子列表(整数开始,整数结束){
返回新的不可移动列表(innerContainer.subList(开始,结束));
}
@非空
@凌驾
公共对象[]toArray(){
返回innerContainer.toArray();
}
@非空
@凌驾
公共T[]阵列(T[]阵列){
返回innerContainer.toArray(数组);
}
}
用法:

List<String> stableList = new UnremovableList(Arrays.asList("A", "B", "C"));
List stableList=新的不可移动列表(Arrays.asList(“A”、“B”、“C”));

为什么要竭尽全力阻止程序员使用remove?或者,如果要实现继承列表接口的自定义对象,只需将remove作为一个不做任何操作的函数重写即可。创建不同的列表对象以停止删除的麻烦似乎是不必要的?最简单的方法是对现有列表实现之一进行子类化,并重写remove方法。同意覆盖列表类,但我
List<String> stableList = new UnremovableList(Arrays.asList("A", "B", "C"));