Альтернативой может быть куча перегруженных методов, например:
private MyNewIncoming createIConnectedSubtypeInstance( OldIncoming connection ) {
return new MyNewIncoming( connection );
}
Это, однако, работает только в том случае, если вызывающая сторона знает, к какому типу относится connection
, в противном случае вам придется полагаться на эти instanceof
проверки.
В этом случае вы могли бы также иметь некоторое отображение OldClass-> NewClass и использовать отражение для создания экземпляров, но я сомневаюсь, что это стоило бы хлопот, если вам не нужно огромное количество отображений.
Пример:
Map<Class<? extends OldConnection>, Class<? extends NewConnection>> mapping; //initializing is up to you
public NewConnection createIConnectedSubtypeInstance(OldConnection connection) {
try {
Class<? extends NewConnection> subtype = mapping.get( connection.getClass() );
return subtype.getConstructor( connection.getClass() ).newInstance( connection );
} catch( Exception e) { //you might want to catch the more specific types
//handle appropriateley
}
}
Обратите внимание, что это зависит от класса connection
, который отображается напрямую. Если вы отображаете суперклассы, вам, возможно, придется проверить их, если не найдено сопоставления для фактического класса connection
.
Кроме того, это зависит от конструкторов новых экземпляров, которые принимают ровно один параметр типа сопоставленного класса.