You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 10的copyOf工厂方法是否适用于不可变类构造方法中的防御性复制?

结论:这种Java 10+的写法完全正确

没错,你给出的Java 10及以上版本的实现是正确且推荐的,完美满足了不可变类中防御性复制的要求。下面具体分析为什么这么写没问题:

为什么List.copyOf()适合防御性复制?

List.copyOf()的核心特性正好匹配不可变类的需求:

  • 它会生成一个不可修改的列表实例:调用方无法通过返回的列表添加、删除或修改元素,彻底杜绝了外部修改内部状态的可能。
  • 它会对输入集合做防御性复制:如果传入的原List是可变的(比如普通ArrayList),List.copyOf()会创建一个独立的副本;如果原集合本身就是不可修改的(比如Collections.unmodifiableList的结果,或者另一个List.copyOf的产物),它会直接返回原集合以优化性能——但无论哪种情况,Thing类内部的widgets都和调用方传入的原集合彻底解耦,调用方后续修改原集合不会影响到Thing的内部状态。

和旧写法的对比

Java 10之前的写法需要两步:

this.widgets = Collections.unmodifiableList(new ArrayList<>(widgets));

先通过new ArrayList<>(widgets)复制原集合,再用Collections.unmodifiableList()包装成不可修改的视图。而List.copyOf()把这两个步骤合并成了一个更简洁的调用,语义也更清晰——直接表达“创建一个不可修改的副本”的意图。

关于getWidgets()的安全性

直接返回widgets也是安全的,因为这个列表本身是不可修改的,外部调用方无法通过它修改Thing类的内部数据,完全符合不可变类的设计原则。

内容的提问来源于stack exchange,提问作者Raedwald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:32:51