我想用 Java 编写一个带有自定义事件的简单事件处理解决方案。到目前为止,我只找到基于 GUI 的示例,使用 ActionListeners。我已经包含了用 C# 编写的代码。
我想用 Java 创建这样的东西:
using System;
using System.Threading;
namespace EventHandlingPractice
{
class Program
{
static void Main(string[] args)
{
MusicServer mServer = new MusicServer();
Sub subber = new Sub();
mServer.SongPlayed += subber.SubHandlerMethod;
mServer.PlaySong();
Console.ReadKey();
}
}
// this class will notify any subscribers if the song was played
public class MusicServer
{
public event EventHandler SongPlayed;
public void PlaySong()
{
Console.WriteLine("The song is playing");
Thread.Sleep(5000);
OnSongPlayed();
}
protected virtual void OnSongPlayed()
{
if (SongPlayed != null)
SongPlayed(this, EventArgs.Empty);
}
}
// this class is class is the subscriber
public class Sub
{
public void SubHandlerMethod(object sender, EventArgs e)
{
Console.WriteLine("Notification from: " + sender.ToString() + " the song was played");
}
}
}
最佳答案
在 Java 中,您通常为事件本身创建一个从 EventObject
扩展的类。感兴趣的事件在以名称 Listener
结尾的接口(interface)中定义,扩展了接口(interface) EventListener
。
能够广播事件的类有一个添加/删除监听器方法,感兴趣的各方可以在其中自行注册。
尽管您的代码无需遵循这些约定也可以工作,但它们(是?)旨在供工具理解类和方法的名称。
这里是您的域的示例伪实现:
public class Song {
}
public class SongEvent extends EventObject {
private final Song song;
public SongEvent(Object source, Song song) {
super(source);
this.song = Objects.requireNonNull(song);
}
public Song getSong() {
return song;
}
}
public interface SongListener extends EventListener {
default void songStarted(SongEvent event) { }
default void songPaused(SongEvent event) { }
}
public class SongServer {
private List<SongListener> listeners = new ArrayList<>();
public void addSongListener(SongListener listener) {
listeners.add(listener);
}
public void removeSongListener(SongListener listener) {
listeners.remove(listener);
}
public void playSong(Song song) {
// ....
SongEvent event = new SongEvent(this, song);
listeners.forEach(l -> l.songStarted(event));
}
}
public class MyEventHandler implements SongListener {
@Override
public void songStarted(SongEvent e) {
System.out.printf("Now listening to %s%n", e.getSong().getName());
}
}
在以前版本的 Java 中,标准包含一个 Adapter
(SongAdapter
),它将实现监听器接口(interface)作为无操作操作。原因是,如果您要添加从适配器扩展的事件类,则不需要添加代码。使用 Java 8,您可以包含默认方法,因此不再需要事件适配器模式。
关于java - Java 与 C# 中的事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46759100/