gpt4 book ai didi

java - 有没有办法让接口(interface)代码在运行时运行?

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

我正在努力在我用 Java 创建的简单游戏引擎中实现事件处理。我现在正在努力弄清楚应该如何注册对象的事件处理程序。我想我也许能够创建一个在创建对象时运行一行代码(public void registerListener(Object Listener))的接口(interface)。我知道接口(interface)无法定义构造函数,因此我正在寻求有关如何处理此问题的指导。现在,我必须在所有具有事件处理程序的对象的构造函数中调用前面提到的代码行,我认为使用接口(interface)或类似的东西来减少重复将是一个理想的解决方案。

下面是事件系统代码的其余部分,以防您想查看。谢谢!

EventManager类:
负责维护响应事件的方法列表。注册EventHandler时,传入一个类作为参数,它会查找所有带@EventHandler()注解的方法,并使用注解值作为事件类型。

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;

public class EventManager
{
private HashMap<Class<? extends Event>, ArrayList<Method>> eventCallbackMap;

public EventManager()
{
this.eventCallbackMap = new HashMap<>();
}

public void dispatchEvent(Event event)
{
ArrayList<Method> callbacks = eventCallbackMap.get(event.getClass());

if(callbacks == null)
{
return;
}

for(Method callback : callbacks)
{
//TODO: Invoke Method
}
}

public void registerListener(Object listener)
{
for(Method method : listener.getClass().getMethods())
{
if(method.isAnnotationPresent(EventHandler.class))
{
Class<? extends Event> value = method.getAnnotation(EventHandler.class).value();

if(eventCallbackMap.containsKey(value))
{
eventCallbackMap.get(value).add(method);
}
else
{
ArrayList<Method> callbacks = new ArrayList<>();
callbacks.add(method);

eventCallbackMap.put(value, callbacks);
}
}
}
}
}

事件类别:
所有自定义事件都将从中扩展的非常准系统的抽象类。如果您能让我知道如何改进这门课,我将不胜感激。

package events;

public abstract class Event
{
public Event()
{
}
}

EventHandler类:
该注解将方法定义为事件响应方法。

package events;

import java.lang.annotation.*;

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EventHandler
{
Class<? extends Event> value();
}

最佳答案

是的。您应该使用接口(interface),而不是注释。一个非常快速的示例可能如下所示。这只是一个代码草图,不确定是否可以编译。还有改进的空间,但这是基本思想:

interface EventHandler
{
Set<Event> eventTypes();
void onEvent(Event event);
}

interface Event
{
// used as a marker interface, but probably add some methods
}

enum MouseEvent implements Event
{
ON_CLICK
//... and whatever else
}

class OnClickEventHandler implements EventHandler
{
public Set<Event> eventTypes()
{
Set<Event> events = new HashSet<>();
events.add(MouseEvent.ON_CLICK);
return events;
}

public void onEvent(Event event)
{
if (event == MouseEvent.ON_CLICK)
{
System.out.println("Mouse clicked");
}
}
}

class EventManager
{
private final Map<Event, List<EventHandler>> handlers = new HashMap<>();

public void registerListener(EventHandler handler)
{
for (Event eventType : handler.eventTypes())
{
handlers.putIfAbsent(eventType, new ArrayList<>());
handlers.get(eventType).add(handler);
}
}

public void dispatchEvent(Event event)
{
handlers.getOrDefault(event, Collections.emptyList())
.forEach(handler -> handler.onEvent(event));
}
}

关于java - 有没有办法让接口(interface)代码在运行时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50476712/

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