即使在使用接口时,您仍需要考虑一个缺陷。
考虑下面的代码:
public void sampleMethod(List<String> list) {
list.add("baz");
System.out.println(list);
}
我们正在使用接口定义唯一非标准操作,但如果你检查documentation,你会发现,add()
操作是可选的。
所以,如果你执行下面的代码
public void test() {
List<String> sampleList = new ArrayList<>();
sampleList.add("foo");
try {
sampleMethod(sampleList);
}catch (Exception e) {
e.printStackTrace();
}
try {
sampleMethod(Collections.unmodifiableList(sampleList));
}catch (Exception e) {
e.printStackTrace();
}
try {
sampleMethod(Collections.singletonList("bar"));
}catch (Exception e) {
e.printStackTrace();
}
}
您将获得:
[foo, baz]
java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
...
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
...
这是一个例子,为什么即使你只使用非标准操作你的程序可能会失败。
该示例位于您找到它的同一页面上。 http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html他们已经在这个例子中使用了Set。 – ha9u63ar 2014-10-27 11:34:57