【问题标题】:Event handling in Java vs in C# [duplicate]Java与C#中的事件处理[重复]
【发布时间】:2018-03-27 07:30:18
【问题描述】:

我想用 Java 编写一个带有自定义事件的简单事件处理解决方案。到目前为止,我只找到了使用 ActionListeners 的基于 GUI 的示例。我已经包含了一个我用 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");
        }
    }
}

【问题讨论】:

  • 您可以遵循观察者模式,即 ActionListeners 的实现。

标签: java c# events eventhandler


【解决方案1】:

在 Java 中,您通常为事件本身创建一个类,从 EventObject 扩展。感兴趣的事件定义在以名称Listener 结尾的接口中,扩展了接口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),它将侦听器接口实现为无操作操作。这样做的原因是,如果您要添加从适配器扩展的事件类,则不需要添加代码。在 Java 8 中,您可以包含默认方法,因此不再需要事件适配器模式。

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多