gpt4 book ai didi

java - Java 与 C# 中的事件处理

转载 作者:行者123 更新时间:2023-12-02 12:07:54 24 4
gpt4 key购买 nike

我想用 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/

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