微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有标准的Java List实现,不允许在其中添加null?

如何解决是否有标准的Java List实现,不允许在其中添加null?

| 说我有一个
List
,我知道我永远不想在上面加上add1ѭ。如果我在其中添加null,则表示我在犯错误。因此,每次我以其他方式致电
list.add(item)
时,我都会致电
if (item == null) throw SomeException(); else list.add(item);
。是否有现成的
List
类(也许在Apache Commons中)用于我? 相似的问题:帮手删除Java列表中的空引用?但我不想删除所有的空值,而是要确保从不添加空值。     

解决方法

        当心-这里的几个答案都声称可以通过包装列表并检入wrapping5ѭ和
addAll
来解决您的问题,但是他们忘记了您也可以通过
listIterator
将其添加到
List
中。正确选择约束清单是一个挑战,这就是为什么番石榴要花9英镑为您做这件事的原因。 但是在查看之前,首先要考虑您是否只需要一个不可变的列表,在这种情况下,Guava的
ImmutableList
仍然会为您进行空检查。而且几乎可以使用JDK的
Queue
实现之一,这也可以做到。 (空敌对集合的好列表:https://github.com/google/guava/wiki/LivingWithNullHostileCollections)     ,        使用Apache Commons Collection:
ListUtils.predicatedList(new ArrayList(),PredicateUtils.notNullPredicate());
在此列表中添加null将抛出
IllegalArgumentException
。此外,您可以通过任何您喜欢的List实现来支持它,并且如有必要,可以添加更多要检查的谓词。 一般而言,集合也是如此。 使用Google Guava:
Constraints.constrainedList(new ArrayList(),Constraints.notNull())
向此列表添加null将抛出
NullPointerException
。     ,        AFAIK,JDK中没有可用的标准实现。但是,Collection规范指出,当collection不支持null时,应引发NullPointerException。您可以使用以下包装器将功能添加到任何Collection中(您必须实现其他Collection方法以将它们委托给包装的实例):
class NonNullCollection<T> implements Collection<T> {

    private Collection<T> wrapped;
    public NonNullCollection(Collection<T> wrapped) {
        this.wrapped = wrapped;
    }
    @Override
    public void add(T item) {
        if (item == null) throw new NullPointerException(\"The collection does not support null values\");
        else wrapped.add(item);
    }
    @Override
    public void addAll(Collection<T> items) {
        if (items.contains(null)) throw new NullPointerException(\"The collection does not support null values\");
        else wrapped.addAll(item);
    }
    ...
}
    ,        您可以通过仅包装List的实例并提供经过null检查的add方法来做到这一点。换句话说,您的类只有两个方法和内部变量。 如果您需要列表的全部功能,则可以考虑使用Guava(以前是Google馆藏)的ForwardingList。 另一种方法是仅扩展List,但要注意的是,您需要同时覆盖
add
addAll
。 有趣的是,番石榴有一个standardAddAll,可以用作addAll的实现,从而至少解决了一部分问题。     ,        尽管这个问题听起来有些“委派”,但是使用子类继承要容易得多,因为您打算继承几乎所有相同的功能。
class MyList extends List {

  //Probably need to define the default constructor for the compiler

  public add(Object  item) {
    if (item == null) throw SomeException();
    else super.add(item);
  }    

  public addAll(Collection c) {
    if (c.contains(null)) throw SomeException();
    else super.addAll(c);
  }
}
    ,        这应该工作
List<String> list = Collections.checkedList(new ArrayList<String>(),String.class);
try {
    list.add(null);
    throw new AssertionError(\"Expected a NPE\");
} catch (NullPointerException expected) {
    System.out.println(\"list.add(null); threw \"+expected);
}
try {
    List<String> list2 = Arrays.asList(\"\",null);
    list.addAll(list2);
    throw new AssertionError(\"Expected a NPE\");
} catch (NullPointerException expected) {
    System.out.println(\"list.addAll(\\\"\\\",null); threw \" + expected);
}
但是addAll实现中的错误意味着您需要使用以下内容
List<String> list = Collections.checkedList(
   Collections.checkedList(new ArrayList<String>(),String.class),String.class);
你得到
list.add(null); threw java.lang.NullPointerException
list.addAll(\"\",null); threw java.lang.NullPointerException
    ,        尝试Collections.checkedList()。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。