2014-10-19 4 views
0

У меня есть класс слушателя, который прослушивает объекты сообщений. Объекты сообщений проверяются для типов экземпляров, и соответствующее действие выполняется после определения типа экземпляра. Ниже приведен пример кодаИспользование оператора instanceof

public void onMessage(IMessage message){ 

    if(message instanceof MoPn) { 
     doThis(); 
    } else if(message instanceof MoAn) { 
     doThat(); 
    } else if(message instanceof MoBn) { 
     doSomethingElse(); 
    } 
} 

Я знаю, что это не самый лучший способ сделать это, но для старых причинам, я не могу изменить его. Теперь я хочу сделать асинхронным обработку сообщений. Все, что я хотел бы сделать, это проверить, попадает ли сообщение в интересующую вас категорию. Если да, поместите его в очередь для асинхронной обработки. Ниже приведен пример класса.

public class SampleClass 
{ 
    List<Class<? extends IMessage>> messageClasses = new ArrayList<Class<? extends IMessage>>(); 

    SampleClass() { 
     messageClasses.add(moAn.class); 
     messageClasses.add(moBn.class); 
     messageClasses.add(moPn.class); 
    } 

    public void onMessage(IMessage message) { 
     for(IMessage messageClass : messageClasses) { 
      if(message instanceof messageClass) { 
       putItInTheQueue(message); 
      } 
     } 
    } 
} 

При написании кода, как указано выше, я не могу правильно отнести класс сообщений. Может ли кто-нибудь помочь мне написать синтаксически правильный код для следующего утверждения?

if(message instanceof messageClass ) 
+1

Элементы вашего списка 'messageClasses' будут объектами' Class', а не 'IMessage'. –

+0

Если вы делаете то же самое для каждого типа сообщений, почему проверка в первую очередь? Или это просто упрощенный пример? – biziclop

ответ

3

instanceof работает только с классами известных во время компиляции. Вместо этого проверьте документацию Class. Вы можете сделать что-то вроде:

public void onMessage(IMessage message) { 
    for(Class<? extends IMessage> messageClass : messageClasses) { 
     if(messageClass.isAssignableFrom(message.getClass())) { 
      putItInTheQueue(message); 
     } 
    } 
} 
+0

должно быть message.getClass(), isAssignableFrom() принимает класс в качестве аргумента – yurib

+0

Да, должно быть, я исправил его. – fgb

1

Как уже упоминалось, вы можете использовать messageClass.isAssignableFrom(message.getClass()).

Вы также можете использовать isInstance method, что является почти точным эквивалентом оператора instanceof (с заменой аргументов). То есть

for(Class<? extends IMessage> messageClass : messageClasses) { 
    if(messageClass.isInstance(message)) { 
     putItInTheQueue(message); 
    } 
} 
Смежные вопросы