【问题标题】:Java Set exception on dupe [closed]Java在欺骗上设置异常[关闭]
【发布时间】:2013-10-22 20:38:00
【问题描述】:

我正在寻找一个现有 Java Set 实现,当使用集合中已经存在的对象调用add 方法时会引发异常。有谁知道一个相当知名的图书馆是否存在?

编辑:这个问题似乎有很多困惑。我不是在问如何实现 set 接口。我需要向供应商提供一个简短的 sn-p 代码,而无需向他们发送一个包含我创建的自定义集合的库。他们将拥有可供他们使用的常用库(据我所知,他们已经使用 Maven 进行了设置)。

【问题讨论】:

  • 构建您自己的集合并将其安装到一些公共 maven 存储库中,并为供应商提供依赖项,以便可以将其放入 pom 中。
  • @LouisWasserman 该规范允许.add() 抛出IllegalArgumentException“如果指定元素的某些属性阻止它被添加到此集合中”。似乎与ImmutableSet.add() throwing UnsupportedOperationException 一样合理。
  • @A4L 我不能。公司政策通常不会留下逻辑空间。
  • 您的公司政策不允许您编写
  • @dimo414:我不同意您对与IllegalArgumentException 相关的文档的解释。特别是,Set.add 文档指出:“如果此集合已包含该元素,则调用将保持集合不变并返回 false。”

标签: java collections set


【解决方案1】:

您可以按照以下方式做一些事情:

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class UniqueSet<E> extends HashSet<E> implements Set<E> {

    private static final long serialVersionUID = 1L;

    public UniqueSet() {
    }

    public UniqueSet(Collection<? extends E> c) {
        super(c);
    }

    public UniqueSet(int initialCapacity) {
        super(initialCapacity);
    }

    public UniqueSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
    }

    @Override
    public boolean add(E e) {
        if (super.contains(e))
            throw new IllegalArgumentException("Already in set!");
        return super.add(e);
    }
}

【讨论】:

    【解决方案2】:

    根据 Effective Java #16,您最好定义一个包含集合并修改其行为的包装类,而不是扩展 HashSet

    import java.util.AbstractSet;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    public class FailFastSet<T> extends AbstractSet<T> {
        private final Set<T> backer;
    
        public FailFastSet() {
            this(new HashSet<T>());
        }
    
        public FailFastSet(Set<T> set) {
            backer = set;
        }
    
        @Override
        public boolean add(T e) {
            if (backer.contains(e))
                throw new IllegalArgumentException(
                    "Cannot add "+e+" - equivalent object already exists.");
            return backer.add(e);
        }
    
        @Override
        public Iterator<T> iterator() {
            return backer.iterator();
        }
    
        @Override
        public int size() {
            return backer.size();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多