Как избежать 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();