Как избежать instanceof в конструкторе копирования для унаследованных Java Clases

Я пишу конструктор копирования для клонирования объекта. Когда класс имеет ссылку на объект, который в дальнейшем наследуется несколькими другими классами.

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. Есть ли способ избежать экземпляра проверки, чтобы создать экземпляр правильного адреса объекта. Могу ли я использовать refelction, чтобы избежать instanceof из кода?

2 ответа

Решение

Во-первых, я думаю, что это опечатка:

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

Во-вторых, вместо приведения объекта вы можете определить метод copy() в классе Address (может быть) abstract:

abstract class Address {
    abstract Address copy ();
}

И вы реализуете метод в каждом из подклассов Address, затем вы можете вызвать его в конструкторе Person:

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

Вы должны делегировать ответственность за копирование адреса на Address учебный класс. Реализуете ли вы Cloneable или нет, положить clone() метод в Address, а затем вы можете (если вам нужна пользовательская обработка) переопределить его в каждом конкретном Address подкласс. Тогда в вашем Person Скопируйте конструктор, который вам нужен:

this.address = p.address.clone();
Другие вопросы по тегам