Collections.emptySet() 和 new HashSet() 的区别 以及 UnsupportedOperationException 的解决方案
背景
公司团队鉴于规范,在hashSet().size() == 0
的情况下,规定使用Collections.emptySet()
代替new HashSet()
进行参数传递,从而引发了java.lang.UnsupportedOperationException
问题复现
import java.util.Collections;
import java.util.Set;
public class UnsupportedOperationExceptionTest {
public static void main(String[] args) {
Set<String> emptySet = Collections.emptySet();
emptySet.add("XX");
System.out.println(emptySet);
}
}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.AbstractCollection.add(AbstractCollection.java:267)
at xxxxx.main(UnsupportedOperationExceptionTest .java:10)
问题分析:
new HashSet<>()
和Collections.emptySet()
。两者都是空集,区分这两者。
一个区别是它new HashSet<>()现在是空的,但以后可能不会是空的(它可以改变,你可以向它添加东西),
而根据规范,Collections.emptySet()
它们现在是空的,以后也会是空的:
你无法向它们添加任何内容,调用 .add()
将导致运行时异常,也就是java.lang.UnsupportedOperationException
。
Collections.emptySet()
在其中返回一个静态类java.util.Collections
,
但new HashSet<>()
返回一个java.util.HashSet
类。
两个集合都将为空,即实例化后 size = 0
,
可以通过调用.getClass()
来返回来区分这两个集合。
参考资料:
https://stackoverflow.com/questions/64382398/collections-emptyset-vs-new-hashset