是否有一个基本的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?