Collections.enumeration用于向下兼容老库(如javax.swing),将现代Collection转为Enumeration;参数须为非空Collection,返回弱一致性快照Enumeration,不支持remove且遍历时修改集合行为未定义。

如何在Java中使用Collections.enumeration适配老版本API_接口转换

为什么需要 Collections.enumeration

因为有些老库(比如早期的 javax.swingjava.beans 或某些 JDK 1.1–1.4 时代的第三方框架)只认 Enumeration,而你手头只有 ListSet 这类现代集合。它不是为了“升级”,而是为了「向下兼容」——把新集合塞进老接口的模具里。

Collections.enumeration 怎么用?参数和返回值要注意什么

它只接受一个 Collection 参数,返回 Enumeration;不能传数组、不能传 Map(得先取 keySet()values()),也不能传 null(会直接抛 NullPointerException)。

示例:

List<String> list = Arrays.asList("a", "b", "c");
Enumeration<String> e = Collections.enumeration(list); // ✅ 正确
// Enumeration<String> bad = Collections.enumeration(null); // ❌ NPE

替代方案比 Collections.enumeration 更灵活的场景

当你要适配的 API 允许自定义 Enumeration 实现,或者需要控制遍历逻辑(比如过滤、延迟计算、流式生成),硬套 Collections.enumeration 反而受限。

容易被忽略的线程安全陷阱

Collections.enumeration 本身不加锁,也不做同步包装。如果你把一个非线程安全的集合(如 ArrayList)传进去,又在另一个线程里并发修改它,Enumeration 遍历时大概率触发 ConcurrentModificationException,但这个异常可能出现在任意一次 nextElement() 调用中,而不是一开始就报错。

最常出问题的地方,是把刚 new 出来的 ArrayList 直接丢进去,然后一边往里 add,一边让老 API 在另一个上下文里遍历——这时候没报错只是运气好。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。