簡體   English   中英

Java列表只添加沒有刪除

[英]Java list only addition no deletion

我想知道是否有可能創建一個Java java.util.List,它只允許添加元素但不允許刪除元素?

我正在考慮重寫刪除方法的一種方法。 請建議。

您可以擴展現有的List實現類並覆蓋所有公共刪除方法,但是有很多方法可以覆蓋(可能更多,下面是我很快發現的)

public class UnDeletableList<E> extends ArrayList<E> {
    @Override
    public E remove(int index) {
        throw new UnsupportedOperationException("don't remove from this list");
    }

    @Override
    public boolean remove(Object o) {
        throw new UnsupportedOperationException("don't remove from this list");
    }

    @Override
    public boolean removeAll(Collection<?> o) {
        throw new UnsupportedOperationException("don't remove from this list");
    }

    @Override
    public boolean retainAll(Collection<?> o) {
        throw new UnsupportedOperationException("don't remove from this list");
    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException("don't remove from this list");
    }

    // OPTIONAL IN CASE OF EXTRA STRICTNESS
    @Override
    public void replaceAll(UnaryOperator<E> u) {
        throw new UnsupportedOperationException("don't remove from this list");
   }

    @Override
    public E set(int i, E e) {
        throw new UnsupportedOperationException("don't remove from this list");
    }
}

這可以使用Decorator模式來實現。 這樣它就可以應用於實現List所有容器:

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);
    }
}

用法:

List<String> stableList = new UnremovableList(Arrays.asList("A", "B", "C"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM