是否有一个基本的Java Set实现不允许空值?

Java Set接口的API指出:

例如,一些实现禁止null元素,一些实现对元素类型有限制

我正在寻找一个基本的Set实现,它不需要排序(因为ArrayList提供了List接口)并且不允许为null 。 TreeSet,HashSet和LinkedHashSet都允许空元素。 此外,TreeSet还要求元素实现Comparable。

目前似乎没有这样的基本Set 。 有谁知道为什么? 或者如果有一个存在的地方我可以找到它?

[编辑]:我不想允许null ,因为在后面的代码中,我的类将迭代集合中的所有元素并调用特定的方法。 (我实际上使用HashSet<MyRandomObject >)。 我宁愿快速失败,也不愿意迟到失败,或者由于集合中存在null而意外招致一些奇怪的行为。


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


我会说使用组合而不是继承......它可能更多的工作,但面对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 ...
}

编辑:另外请注意,这个实现不依赖于addAll调用add(这是一个实现细节,不应该被使用,因为它不能保证在所有的Java版本中保持为真)。

编辑:添加更多描述性错误消息。

编辑:使它清楚()不返回任何东西。

编辑:制作它是这样添加(E e)。

编辑:抛出IllegalArgumentException而不是NullPointerException。


没有基本的专有Set实现忽略或约束null! 有EnumSet,但是它是为enum类型的遏制量身打造的。

但是,如果您使用Guava或Commons Collections,则可以避免创建自己的实现:

1.番石榴解决方案:

Set noNulls = Constraints.constrainedSet(new HashSet(), Constraints.notNull());

2.共同收藏:

Set noNulls = new HashSet();
CollectionUtils.addIgnoreNull(noNulls, object);
链接地址: http://www.djcxy.com/p/76203.html

上一篇: Is there a basic Java Set implementation that does not permit nulls?

下一篇: Best way to check for null values in Java?