是否存在不允许空值的基本 Java Set 实现?

2022-09-01 08:16:24

Java Set 接口的 API 声明:

例如,某些实现禁止元素,而某些实现对其元素的类型有限制null

我正在寻找一个不需要排序的基本Set实现(如ArrayListList接口提供的那样),并且不允许。TreeSetHashSetLinkedHashSet 都允许空元素。此外,TreeSet 还要求元素实现可比较性null

目前似乎不存在这样的基本原理。有谁知道为什么吗?或者,如果确实存在一个,我可以在哪里可以找到它?Set

[编辑]:我不想允许 s,因为在代码的后面,我的类将循环访问集合中的所有元素并调用特定方法。(我实际上是在用>)。我宁愿快速失败,也不愿在以后失败,或者由于在集合中而意外地产生一些奇怪的行为。nullHashSet<MyRandomObjectnull


答案 1

与扩展特定实现相比,您可以轻松编写该检查的代理实现。这类似于 。除了适用于任何实现之外,您还可以确保已覆盖所有适用的方法。通过扩展具体集合发现了许多缺陷,然后在以后的版本中添加了其他方法。SetnullCollections.checkedSet


答案 2

我会说使用组合而不是继承...它可能会有更多的工作,但面对Sun可能对集合框架进行的任何更改,它会更加稳定。

public class NoNullSet<E> implements Set<E>
{
   /** The set that is wrapped. */
   final private Set<E> wrappedSet = new HashSet<E>();

   public boolean add(E e)
   {
     if (e == null) 
       throw new IllegalArgumentException("You cannot add null to a NoNullSet");
     return wrappedSet.add(e);
   }

   public boolean addAll(Collection<? extends E> c)
   {
     for (E e : c) add(e);
   }

   public void clear()
   { wrappedSet.clear(); }

   public boolean contains(Object o)
   { return wrappedSet.contains(o); }

   ... wrap the rest of them ...
}

请注意,此实现不依赖于调用(调用是实现细节,不应使用,因为它不能保证在所有 Java 发行版中都保持为真)。addAlladd