java 如何使用复制构造函数创建Object数组内容的深层副本,而不实现cloneable()或arraycopy()?

u3r8eeie  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(100)

我需要创建一个数组内容的副本,数组内容由不同类型的各种Object组成,但是我不能使用显式强制转换来检查Object的类型,也不能使用可克隆接口/arraycopy方法。
首先,我创建了一个超类,所有其他类都从这个超类扩展而来,但我不确定如何使用特定类的复制构造函数。

public Building(Object obj) {
    try {
        this.windows= ((House)obj).windows; 
        this.basement = ((House)obj).basement; 
    } catch (ClassCastException ex) {
        this.windows = 0; 
        this.basement = false;
    }
    ... (various other try-catch blocks here)
}

驱动程序为:

public static Building[] copyBuildings(Building[] objects) {

    Building[] objList = new Building[objects.length];
        
    for (int i = 0; i < objects.length; i++) {    
        objList[i] = new Building(objects[i]);
    }
        
    return objList; 
}

但是,这并没有像我希望的那样正确地调用子类的复制构造函数,因为它根本没有引用它们,我不知道如何继续。
请记住,没有显式类型转换,如果我在运行时不知道对象的显式类型,是否可以调用Object的复制构造函数(是否需要修改当前代码)?或者多态性不以这种方式工作?
任何帮助都将不胜感激!(以及一般的反馈,我真的不习惯使用stackoverflow)

brvekthn

brvekthn1#

显然,您有一个包含各种Building子类型的Building[],并且您希望创建一个深副本。
不能通过实现Building复制构造函数来完成此操作。
为什么?
因为Building的构造函数 * 只能 * 构造Building示例。它 * 不能 * 构造House示例...或HotelChurch或...
然而,有各种各样的替代品 * 将 * 工作:

  • Building及其每个子类型中实现Cloneable
  • 实现一个 * factory * 方法或类来创建Building,让它使用instanceof(或Java18+模式开关)来区分子类,然后为每个子类使用合适的构造函数;例如:
if (building instanceof House) {
    return new House((House) building);
} else if (building instanceof Hotel) {
    return new Hotel((Hotel) building);
} else ...
  • 使用反射。这很复杂,但是你不需要为层次结构中的每个单独的类或子类编写代码。

每种选择都有优点和缺点,我们不能建议哪种选择对每个用例最好,当然,没有一种选择对所有用例都是完美的。

相关问题