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

标签 java c# events eventhandler

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

相关文章:

java - 在 ScrollPanel 内时将 FlowPanel 高度设置为 100%?

java - 静态同步方法上的锁定是否会影响其实例的非静态同步方法?

c# - 如何在编辑 DataGridView 单元格周围绘制边框?

c# - 如何删除 MenuStrip 控件下绘制的白线?

c# - 事件似乎没有正确连接

multithreading - POSIX 的扩展允许 select() 或等效函数终止进程

java - 我的椭圆创建程序仅创建直线

java - Freemarker 和 webflux 错误

c# - 如何异步加载本 map 片?

WPF 事件,声明式还是处理程序?