【问题标题】:How to prevent element deleting from ArrayList in Java?如何防止从 Java 中的 ArrayList 中删除元素?
【发布时间】:2014-04-29 15:56:24
【问题描述】:

我想要一个ArrayList,并限制元素删除。我该怎么做?

【问题讨论】:

  • 你想要一个ArrayList,你永远不能从中删除一个元素吗?为什么这被标记为magic
  • 我认为这是非常困难的情况。对我来说就像魔法一样。
  • @Arkasha 没有什么是编程世界是魔法(除了来自新手的优秀的最佳可读代码,这就是魔法)。

标签: java


【解决方案1】:

List 接口上创建一个不允许删除的包装器,只允许删除所需的方法:

class MyArrayList<T> {
    private List<T> list;

    public MyArrayList() {
        list = new ArrayList<T>();
    }

    public boolean add(T t) {
        return list.add(t);
    }
    //add other desired methods as well
}

另一个不推荐的选项是从ArrayList 扩展并覆盖remove 方法以不执行任何操作,但这是不希望的,因为除非确实需要,否则不应从这些类扩展:

public MyArrayList<T> extends ArrayList<T> {
    @Override
    public boolean remove() {
        //do nothing...
    }
}

此外,您可以使用 Collections#unmodifiableList 包装当前的 List 以避免删除元素(即上面提到的包装类,除了实现 List),但请注意,您也不能添加元素。

【讨论】:

  • 为了让它更好地工作,我会添加List接口的实现,所以包装器可以放在List&lt;T&gt;字段中,它的存在是透明的。
  • @T.G 这将取决于 OP 的设计。我不想将提议的包装器绑定到List 接口(请注意我答案底部的注释)。
【解决方案2】:

创建 ArrayList 的子类并覆盖删除方法。

如果您想禁止所有修改,请使用 Collections.unmodifiableList。

【讨论】:

    【解决方案3】:

    使用 google guava 库中的 ImmutableList 类。

    顺便说一句:这是重复的:make ArrayList Read only

    【讨论】:

    • TO 只想防止删除...不是所有操作 :)
    【解决方案4】:

    您可以创建自己的扩展 ArrayList 的类,并像示例中那样阻止所有删除方法

    公共类 NoDeleteArray 扩展 ArrayList{

        @Override
        public boolean remove(Object o) {
            return super.remove(o); //To change body of generated methods, choose Tools | Templates.
        }
    
        @Override
        public boolean removeAll(Collection c) {
            return false;
        }
    
        @Override
        public Object remove(int index) {
            return null;
        }
    
        @Override
        protected void removeRange(int fromIndex, int toIndex) {
    
        }
    
        @Override
        public boolean retainAll(Collection c) {
             return false;
        }
    
    }
    

    这里所有的 remove 方法都覆盖了原始方法并且什么都不做。例如,您还可以执行一些验证以检查是否可以从集合中删除对象

    @Override
    public Object remove(int index) {
        MyClass tmp = (MyClass) get(index);
        if (tmp.isDeletable()) {
            return super.remove(index);
        } else {
            return null;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2013-02-24
      • 2021-01-25
      相关资源
      最近更新 更多