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

kun*_*nal 0 java inheritance copy-constructor cloning

我正在编写一个用于克隆对象的复制构造函数.当一个类引用一个对象时,该对象被其他几个类进一步说明.

class Person
{
    String name;
    Address address;
 }

class HomeAdress extends Address
{
}
class OfficeAdress extends Address
{
}
Run Code Online (Sandbox Code Playgroud)

现在在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 8

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

this.address = p.address.clone();
Run Code Online (Sandbox Code Playgroud)

  • 正确实现`clone`没有任何问题.你与复制构造函数的斗争是你应该使用`clone`的确切原因. (3认同)
  • @kunal:当你不同意我的回答时,我很感兴趣你为什么接受了一个与我的答案实际相同的答案.(可克隆的概念与您是否实际实现`Cloneable`接口并使用`java.lang.Object`中的`clone()`分开.) (2认同)