gpt4 book ai didi

java - 如何在CDI事件中使用参数?

转载 作者:行者123 更新时间:2023-11-29 03:29:30 24 4
gpt4 key购买 nike

我正在寻找一种方法来向使用 CDI 事件机制传播的事件添加某种参数。

我知道在我的例子中我可以创建不同的事件,但我正在寻找一种方法来重用相同的事件,但使用不同的参数。然后使用此事件参数注释一些方法,以便在触发事件时仅调用此方法。

下面的例子不起作用,但说明了我的意图。这有可能吗?

//custom event class
public class NotifyChange {

}

//change the model and notify the view
public class MyPresenter {
@Inject
private Events<NotifyChange> events;

public void updateUser() {
//change some user settings
events.fire(new NotifyChange("user")); //that what I'm somehow looking for
}

public void updateCustomer() {
//change some customer settings
events.fire(new NotifyChange("customer"));
}
}

//change the view according to events
public class MyView {
void listenUserChange(@Observes NotifyChange("user") evt) {
//update UI
}

void listenCustomerChange(@Observes NotifyChange("customer") evt) {
//update UI
}
}

最佳答案

如果你想避免为每个事件创建类和注释,我想最好的方法是使用限定符参数。您的代码如下所示:

//MyPresenter.class
@Inject @ChangeType(Role.USER)
private Event<NotifyChange> userEvent;

@Inject @ChangeType(Role.CUSTOMER)
private Event<NotifyChange> custumerEvent;

public void updateUser() {
userEvent.fire(new NotifyChange());
}

public void updateCustomer() {
custumerEvent.fire(new NotifyChange());
}


//MyView.class
public void listenUserChange(
@Observes @ChangeType(Role.USER) NotifyChange evt) {
}

void listenCustomerChange(
@Observes @ChangeType(Role.CUSTOMER) NotifyChange evt) {
}

//Role.class
public enum Role {
USER, CUSTOMER
}

//ChangeType
@Qualifier
@Target({ PARAMETER, FIELD })
@Retention(RUNTIME)
public @interface ChangeType {

Role value();
}

更多文档:http://docs.jboss.org/weld/reference/1.1.5.Final/en-US/html_single/#d0e4018

关于java - 如何在CDI事件中使用参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19095000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com