如何避免继承java类的复制构造函数中的instanceof

时间:2013-03-01 14:09:07

标签: java inheritance copy-constructor cloning

我正在编写一个用于克隆对象的复制构造函数。当一个类引用一个对象时,会被其他几个类进一步介绍。

class Person
{
    String name;
    Address address;
 }

class HomeAdress extends Address
{
}
class OfficeAdress extends Address
{
}

现在在Person的复制构造函数中,要决定要对哪个Address对象进行信息化,我必须使用instanceof。

public Person(Person p)
{
    name = p.name;
    if(p.address instanceof HomeAddress)
    {
        address = new HomeAddress((HomeAddress) address);
    }else if(p.address instanceof OfficeAddress)
    {
        address = new OfficeAddress((OfficeAddress) address);
    }
}

因此,当将新类型的地址添加到模型时,这是基本问题。我将不得不在Person复制构造函数中添加相同的检查。有没有办法避免instanceof检查实例化正确的地址对象。我可以使用refelction来避免代码中的instanceof吗?

2 个答案:

答案 0 :(得分:8)

您应该将复制地址的责任委托给Address课程。无论您是否实施Cloneable,请在clone()中添加Address方法,然后您可以(如果需要自定义处理)在每个特定的Address子类中覆盖它。然后在Person复制构造函数中,您只需要:

this.address = p.address.clone();

答案 1 :(得分:-2)

首先,我猜这是一个错字:

address = new HomeAddress((HomeAddress) p.address);

其次,不是强制转换对象,而是可以在Address类中定义一个copy()方法,(可能是)abstract:

abstract class Address {
    abstract Address copy ();
}

然后在Address的每个子类中实现该方法,然后可以在Person的构造函数中调用它:

public Person(Person p)
{
    name = new String(p.name);
    address = p.address.copy();
}