首页 > 解决方案 > 如何创建添加侦听器并允许添加 JAVA 代码的方法

问题描述

几天来我一直在尝试制作事件系统,但我找不到执行以下操作的方法。

我找不到使事件可从方法交互的方法,我的意思是:


    api.addEventListener (event -> {
        CODE
    );

操作很简单,我希望在该方法中向侦听器触发事件​​时,我可以添加我的代码。

我对 Java 比较陌生,但仍然在为这种事情苦苦挣扎。

我目前有这 5 个课程:

此接口对应于侦听器,即接收事件的接口。


    public interface UserCreateMessageListener extends GloballyAttachableListener {
        void fire ();
    }

执行上述。


    public class UserCreateMessageListenerImpl implements UserCreateMessageListener {
        @Override
        public void fire () {
            //CODE
        }
    }

此接口将包含添加侦听器和通过添加代码接收事件的方法(我打算在上面的示例中查找)


    public interface GloballyAttachableListener {
        default void addUserCreateMessageEvent (UserCreateMessageListener listener) {
            // I add the listeners to my listener initializer
        }
    }

此类向声明的侦听器触发事件​​。


    public class Initializer extends ListenerAdapter {
        private static List <UserCreateMessageListener> listeners = new ArrayList <UserCreateMessageListener> ();
    
        public static void addListener (UserCreateMessageListener toAdd) {
            listeners.add (toAdd);
        }
    }
    
    @Override
    public void onMessageReceived (MessageReceivedEvent event) {
        for (UserCreateMessageListener e: listeners) {
            e.fire ();
        }
    }

这个类是我打算从中获取信息和事件的类。


    public interface Api extends GloballyAttachableListener {
    
        default String getPrefix () {
            return ConfigAccessor.getPrefix ();
        }
    
        default long getId () {
            return ConfigAccessor.getId ();
        }
    }

标签: java

解决方案


如果您有一个对象的方法与您的侦听器的签名相匹配(即在这种情况下void返回类型且没有参数):

class Thing {
    void whatever();
}

您可以使用方法引用来引用它:

Thing thing = new Thing();
initializer.addListener(thing::whatever);

您还可以将侦听器指定为功能接口

@FunctionalInterface
public interface UserCreateMessageListener ... {
}

推荐阅读