I was making my own Event System and tried to make it usable like this.
EventSystem.get(EventClientStart.class)
.setCallback((event) -> {
System.out.println("Client Started");
});
EventSystem.get(EventClientStart.class)
.invoke(new EventClientStart());
But got a problem with checks of type, what did I miss? T extends Event, I think it should work, and it actually is (only if I will cast it to (EventController), but then I will get warning "Unchecked Cast")
EventSystem.java
package im.silkproject.event;
import im.silkproject.event.internal.EventController;
import java.util.HashMap;
import java.util.Map;
public final class EventSystem
{
private static final Map<Class<? extends Event>, EventController<? extends Event>> map = new HashMap<>();
private EventSystem() { }
public static <T extends Event> EventController<T> get(Class<T> event)
{
return map.computeIfAbsent(event, k -> new EventController<>());
}
}
Event.java
package im.silkproject.event;
public class Event
{
private boolean cancelled;
public void cancel()
{
cancelled = true;
}
public boolean isCancelled()
{
return cancelled;
}
}
EventCallback.java
package im.silkproject.event.internal;
@FunctionalInterface
public interface EventCallback<T>
{
void __call(T event);
}
EventController.java
package im.silkproject.event.internal;
import java.util.concurrent.CopyOnWriteArrayList;
public class EventController<T>
{
private final CopyOnWriteArrayList<EventCallback<T>> callbacks = new CopyOnWriteArrayList<>();
public void invoke(T event)
{
for (EventCallback<T> callback : callbacks)
{
callback.__call(event);
}
}
public int length()
{
return callbacks.size();
}
public boolean setCallback(EventCallback<T> event)
{
return callbacks.addIfAbsent(event);
}
public boolean unsetCallback(EventCallback<T> event)
{
return callbacks.remove(event);
}
}
