2012-06-10 1 views
1

Есть ли способ использования наследования классов с событиями CDI?Наследование наследования CDI

Допустим, у меня есть что-то вроде этого:

public class ParentEvent{} 

public class ChildEvent extends ParentEvent{} 

и что-то вроде этого:

public class Manager(){ 
    @Inject 
    private Event<ParrentEvent> event; 

    public void foo(){ 
     event.fire(new ParentEvent()); 
    } 

    public void bar(){ 
     event.fire(new ChildtEvent()); 
    }   
} 

public class Observer{ 

     public void observesParent(@Observes ParentEvent event){ 
      //do something 
     } 

     public void observesChild(@Observes ChildEvent event){ 
      //do something 
     } 
} 

В этом случае оба ParentEvent и ChildEvent обрабатываются observesParent() - в зависимости от типа события атрибут в классе Manager. Есть ли способ наблюдать ChildEvent с помощью обоих методов наблюдателя?

+0

Я рекомендовал бы ваши КДИ Событие незыблемым и окончательным, чтобы избежать каких-либо сюрпризов. Я не уверен, что было бы хорошей идеей разрешить модификацию поведения чем угодно, наследование или иначе. –

ответ

2

Идея CDI состоит в том, чтобы использовать квалификаторы в связи с событиями/наблюдателями (а не наследованием). Проверьте that chapter в документации Weld. Желаемое поведение должно быть легко достижимо с чем-то вроде этого:

public class Manager(){ 
    @Inject 
    @Parent 
    private Event<MyEvent> parentEvent; 

    @Inject 
    @Child 
    private Event<MyEvent> childEvent; 

// ... 

    public void foo(){ 
     event.fire(parentEvent); 
    } 

    public void bar(){ 
     event.fire(childEvent); 
    } 
} 


public void observeChild(@Observes @Child MyEvent myEvent) { ... } 
public void observeParent(@Observes @Parent MyEvent myEvent) { ... } 
public void observeAll(@Observes MyEvent myEvent) { ... } 

Это гораздо более гибкий, чем при использовании наследования ...

+0

Основная проблема заключается в том, что вы не можете абстрагировать наблюдение (я имею в виду сторону наблюдателя) меканизм с квалифицированными или родовыми событиями. Было бы интересно, чтобы это можно было сделать, например, для обеспечения какой-то структуры, используемой вашим бизнес-уровнем приложения. – kij

 Смежные вопросы

  • Нет связанных вопросов^_^