我有一个类(“管理器”),它管理一个对象集合,这些对象都植根于一个共同的超类(“管理”)。manager 类有时需要复制选定的托管对象,但无法知道它是 Managed 的哪个子类。在我看来,最好的(如果不是唯一的)方法是使用 Cloneable。然后,对于我需要复制的任何托管对象,我调用 managedObject.clone()。当然,它必须正确实施。我已经阅读了许多关于“只使用复制构造函数”或为所有子类实现 myManagedSubClass.copy() 方法的警告。我看不到如何使用“真正的”复制构造函数,因为我需要知道类型:
ManagedSubclass copiedObject = new ManagedSubclass(existingManagedSubclassObject);
如果我实现 copy() 方法,我认为应该是这样的:
class Managed {
public Managed copy() {
Managed newObject = new Managed(Managed other);
// fixup mutable fields in newObject
}
}
但在我的使用中,我必须将返回值转换为预期的类型。如果我忘记在所有托管子类上实现 copy(),那么我最终会将超类强制转换为子类类型。我无法在 Managed 上设置受版权保护的可见性,因为这是直接复制的有效类。即使不是这种情况,我也必须在每个可以复制的子类上实现复制,并使用所有机制来处理可变字段的深层副本,或者建立我自己的某个通用名称的受保护方法的协议来处理所有问题该级别的超类引入的可变字段。
似乎尽管对 Cloneable 普遍感到愤怒和仇恨,但它是做我想做的最好的方式。我错过了什么吗?