2016-01-13 5 views
1

У меня есть следующий метод:Исключая условный оператор с InstanceOf проверяет

@Override 
public <T> T method(T object){ 
    if(object instanceOf Type1){ 
    ... 
    } 
    elseif(object instanceOf Type2){ 
    ... 
    } 
    ... 
} 

object всегда типа SuperType и Type1, Type2, ... являются все подтипы SuperType. У меня нет доступа к любым типам SuperType, Type1 и т. Д., Поэтому я не могу их изменить.

Я хотел бы устранить эту структуру, у которой есть много if -s и instanceOf чеков. Я попытался реализовать шаблон Visitor для этой цели, но он не работал, так как я не могу изменить ни один из упомянутых выше типов.

Кто-нибудь знает хорошее решение для этого примера? Спасибо!

+0

Не следует избегать 'instanceof', но если' object' всегда имеет тип 'SuperType', вы должны, вероятно, объявить' '. – Thilo

+0

Метод - это переопределенная версия типа, к которому у меня нет доступа, подпись метода должна оставаться неизменной. –

+0

Ссылки по теме: http://stackoverflow.com/questions/16665898/when-if-else-instance-of-are-inevitable-how-do-we-improve-the-design-apart?rq=1 – Thilo

ответ

0

У вас может быть стол для отправки.

private final static Map<Class<?>, Handler> dispatch = .... 
// contains things like Type2.class -> Type2Handler 

dispatch.get(object.getClass()).handle(object); 
// may need to iterate superclasses if that is a concern 

Не уверен, что это лучше.

+0

Кажется, быть немного проще поддерживать хотя бы :) –