在 Java 中,Event(事件)通常是通过事件源(Event Source) + 事件对象(Event Object) + 事件监听器(EventListener)三部分来定义的。下面从基础定义方式和常见实现方式给你说明。
EventObject)import java.util.EventObject;
public class MyEvent extends EventObject {
private String message;
public MyEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
source:事件发生的对象(谁触发的)EventObject 是 Java 标准事件基类EventListener)import java.util.EventListener;
public interface MyEventListener extends EventListener {
void onMyEvent(MyEvent event);
}
import java.util.ArrayList;
import java.util.List;
public class EventSource {
private List<MyEventListener> listeners = new ArrayList<>();
public void addMyEventListener(MyEventListener listener) {
listeners.add(listener);
}
public void removeMyEventListener(MyEventListener listener) {
listeners.remove(listener);
}
public void fireEvent(String message) {
MyEvent event = new MyEvent(this, message);
for (MyEventListener listener : listeners) {
listener.onMyEvent(event);
}
}
}
public class Test {
public static void main(String[] args) {
EventSource source = new EventSource();
source.addMyEventListener(event -> {
System.out.println("收到事件:" + event.getMessage());
});
source.fireEvent("Hello Event!");
}
}
Java 本身大量使用事件模型,例如:
button.addActionListener(e -> {
System.out.println("按钮被点击");
});
对应:
ActionEvent:事件对象ActionListener:监听器JButton:事件源如果你用的是 Spring,事件更简单:
public class UserCreatedEvent {
private String username;
public UserCreatedEvent(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
}
@Autowired
private ApplicationEventPublisher publisher;
public void createUser() {
publisher.publishEvent(new UserCreatedEvent("Tom"));
}
@Component
public class UserEventListener {
@EventListener
public void handle(UserCreatedEvent event) {
System.out.println("用户创建:" + event.getUsername());
}
}
| 方式 | 使用场景 |
|---|---|
| 自定义 Event + Listener | 普通 Java 项目 |
| AWT / Swing Event | GUI 程序 |
| Spring Event | 企业级 / 解耦业务 |
如果你是初学者 / 面试 / Spring / GUI 场景,我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。