Java的EnumSet是否可变?能否修改EnumSet对象及相关疑问
Java EnumSet的可变性详解
嘿,这个问题抓得很准,我来帮你把这些点串明白:
首先明确结论:EnumSet本身是可变的,你遇到的add()抛异常的困惑,是因为没注意到EnumSet的具体实现已经重写了父类的方法。
- 虽然
EnumSet继承自AbstractSet,而AbstractSet里的默认add()、remove()确实会抛出UnsupportedOperationException,但EnumSet的实际实现类(JDK里的RegularEnumSet和JumboEnumSet,都是包私有类)已经完全重写了这些修改方法,所以正常调用是可以修改集合的。举个实际例子:
enum Fruit { APPLE, BANANA, ORANGE } EnumSet<Fruit> fruits = EnumSet.of(Fruit.APPLE); fruits.add(Fruit.BANANA); // 完全正常,不会抛异常 System.out.println(fruits); // 输出 [APPLE, BANANA]
- 至于
clone()方法的存在,恰恰是因为EnumSet是可变的——它的作用是创建一个当前集合的可变副本,你可以修改这个副本而不会影响原集合,这是可变集合的常规操作场景。比如:
EnumSet<Fruit> original = EnumSet.of(Fruit.APPLE); EnumSet<Fruit> cloned = original.clone(); cloned.add(Fruit.ORANGE); System.out.println(original); // 输出 [APPLE] System.out.println(cloned); // 输出 [APPLE, ORANGE]
- 再说到Guava的
Sets.immutableEnumSet():因为JDK默认提供的EnumSet都是可变的,但实际开发中经常需要不可变的集合(比如保证线程安全、防止代码意外修改集合内容),所以Guava专门提供了这个方法,返回一个不可变的EnumSet实现——这个不可变版本会拒绝任何修改操作,调用add()、remove()时才会抛出UnsupportedOperationException。
简单总结:EnumSet是支持修改的,它的实现类重写了所有必要的修改方法;clone()是可变集合的标准功能;Guava的不可变版本是为了填补JDK在不可变EnumSet上的空白。
内容的提问来源于stack exchange,提问作者DodgyCodeException
相关产品推荐
相关产品推荐

