2012-06-10 61 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

我建議你CDI事件是不可變的,並最終以避免任何意外。我不確定允許通過任何事情,繼承或其他方式修改行爲是一個好主意。 –

回答

2

CDI的想法是使用限定符與事件/觀察者(而不是繼承)結合使用。檢查Weld文檔中的that chapter。期望的行爲應該是像這樣的東西很容易實現:

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