问题描述
|
说我有一个
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()。