仅Java列表添加而没有删除 - java

我想知道是否有可能创建一个Java java.util.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"));

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

Java 1.6中@Override注释的意义是什么? - java

This question already has answers here: Closed 7 years ago. Possible Duplicate: When do you use Java's @Override annotation and why?由于此注释,我一直遇到不兼容问题。反正有什么意义呢?简单地覆盖方法和使用@overri…