java:当你只有一个接口时如何制作防御性拷贝

4 java copy interface

如果一个对象引用另一个对象,我知道制作传入对象的副本以保留封装是个好主意.但是,如果所有对象都知道传入的对象是它实现了一个接口呢?

例如,如果我有一个在其构造函数中采用FilenameFilter实现的对象,那么当我所知道的是它实现FilenameFilter时,如何制作它的防御性副本?我不得不诉诸反射吗?

cle*_*tus 6

处理此类问题时最好的办法是尽可能多地使对象成为不可变对象,这意味着它们在创建后无法修改.如果你需要修改它们,你可以制作一个新的原始版本,保持原始状态不变.

这也适用于多线程.

作为一般规则,可变对象不被视为"最佳实践".你不能完全消除它们,但正如乔什布洛赫所说,赞成不变性.

话虽这么说,但没有任何方法可以以任何形式保证深层复制(这是你需要的).如果您只是简单地传入一个接口,那么您唯一的选择就是反映某种形式或将副本复制到另一个实现相同接口的对象(如果可能的话).