想象一下,你有一个派生类,其中基类是你无法修改的.基类有很多状态(许多非常量私有成员)和许多构造函数,具有不同数量的参数来初始化状态的某个子集(当然,子集的大小因构造函数而异).
现在我的派生类是基类的一个非常轻量级的包装器.让我们假设它没有添加自己的状态,只是略微修改了几个方法的行为(可能围绕super.originalMethod()调用进行一些额外的记录).
我遇到的问题是我想要获取基类的对象,并创建它的“副本”,具有相同的状态,但作为我的派生类的实例.
这证明是困难的.我不能调用基类的“最完整”构造函数,通过调用getters从源传递所有状态,因为根据基类的构造方式,这个构造函数可能会拒绝某些状态值.例如,您可以使用0-arg ctor创建默认对象,任何多个值都将为null.但是,在ctor中传递允许您指定这些值的空值是不合法的.
此外,上面的方法很脆弱,因为如果对基类进行修改会增加更多的状态,并且添加“甚至更完整”的构造函数(或者不能在构造函数中设置的状态,只能通过访问器方法),副本将不再完整.
我想要的是`clone(),而是初始化相同类型的新对象,初始化派生类的基类成员.我猜这样的事情不存在.对模式的任何建议可能提供相同的东西?
请记住,我无法修改基类.如果可以的话,这会容易得多.
解决方法:
如果可以覆盖所有公共方法,则可以将源对象另存为委托
Class D extends B
B src;
D(B src){ super(whatever); this.src=src; }
public method1(){ src.method1(); }
标签:java,clone,design-patterns,constructor,factory
来源: https://codeday.me/bug/20190610/1210239.html