Исходник Простая система событий

Начинающий
Статус
Оффлайн
Регистрация
1 Ноя 2023
Сообщения
55
Реакции[?]
3
Поинты[?]
1K
Что еще можно добавить или доработать ?
EventBus:
public class EventBus {

    private static final Map<Class<? extends Event>, Set<Listener<? extends Event>>> listeners = new HashMap<>();

    public static void setObjectStateForListener(Object object, boolean register) {
        Stream.of(object.getClass().getDeclaredFields())
                .filter(field -> field.getType().equals(Listener.class))
                .forEach(field -> {
                    boolean accessible = field.isAccessible();
                    try {
                        if (!accessible) {
                            field.setAccessible(!accessible);
                        }
                        Class<? extends Event> eventType = (Class<? extends Event>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
                        if (register) {
                            listeners.computeIfAbsent(eventType, _ -> new HashSet<>()).add((Listener<? extends Event>) field.get(object));
                        } else {
                            listeners.get(eventType).remove((Listener<? extends Event>) field.get(object));
                        }
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                    } finally {
                        if (accessible != field.isAccessible()) {
                            field.setAccessible(accessible);
                        }
                    }
                });
    }

    protected static Map<Class<? extends Event>, Set<Listener<? extends Event>>> getListeners() {
        return listeners;
    }
}
Event:
public class Event extends EventBus {

    private boolean cancel;

    public <E extends Event> E execute() {
        setCancel(false);
        Set<Listener<? extends Event>> listeners = getListeners().get(this.getClass());
        if (Objects.nonNull(listeners)) {
            listeners.stream()
                    .map(listener -> (Listener<E>) listener)
                    .forEach(listener -> listener.execute((E) this));
        }
        return (E) this;
    }

    public void setCancel(boolean cancel) {
        this.cancel = cancel;
    }

    public boolean isCancel() {
        return cancel;
    }
}
Listener:
@FunctionalInterface
public interface Listener<E extends Event> {

    void execute(E event);
}
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2021
Сообщения
521
Реакции[?]
53
Поинты[?]
20K
Что еще можно добавить или доработать ?
EventBus:
public class EventBus {

    private static final Map<Class<? extends Event>, Set<Listener<? extends Event>>> listeners = new HashMap<>();

    public static void setObjectStateForListener(Object object, boolean register) {
        Stream.of(object.getClass().getDeclaredFields())
                .filter(field -> field.getType().equals(Listener.class))
                .forEach(field -> {
                    boolean accessible = field.isAccessible();
                    try {
                        if (!accessible) {
                            field.setAccessible(!accessible);
                        }
                        Class<? extends Event> eventType = (Class<? extends Event>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
                        if (register) {
                            listeners.computeIfAbsent(eventType, _ -> new HashSet<>()).add((Listener<? extends Event>) field.get(object));
                        } else {
                            listeners.get(eventType).remove((Listener<? extends Event>) field.get(object));
                        }
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                    } finally {
                        if (accessible != field.isAccessible()) {
                            field.setAccessible(accessible);
                        }
                    }
                });
    }

    protected static Map<Class<? extends Event>, Set<Listener<? extends Event>>> getListeners() {
        return listeners;
    }
}
Event:
public class Event extends EventBus {

    private boolean cancel;

    public <E extends Event> E execute() {
        setCancel(false);
        Set<Listener<? extends Event>> listeners = getListeners().get(this.getClass());
        if (Objects.nonNull(listeners)) {
            listeners.stream()
                    .map(listener -> (Listener<E>) listener)
                    .forEach(listener -> listener.execute((E) this));
        }
        return (E) this;
    }

    public void setCancel(boolean cancel) {
        this.cancel = cancel;
    }

    public boolean isCancel() {
        return cancel;
    }
}
Listener:
@FunctionalInterface
public interface Listener<E extends Event> {

    void execute(E event);
}
говнокода бы поменьше, вот че предложить могу
 
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2021
Сообщения
521
Реакции[?]
53
Поинты[?]
20K
мне лень вчитываться в весь этот код, но говнокод тут имеется это очевидно, сделай попроще и читабельней..
примерно такую же систему событий я писал полгода назад и поэтому знаю, что пишу
 
Эксперт
Статус
Онлайн
Регистрация
29 Мар 2021
Сообщения
1,523
Реакции[?]
572
Поинты[?]
8K
мне лень вчитываться в весь этот код, но говнокод тут имеется это очевидно, сделай попроще и читабельней..
примерно такую же систему событий я писал полгода назад и поэтому знаю, что пишу
а конкретнее? в джаве не шарю, но код выглядит чисто.. если есть какой то синтаксис покруче - показывай, ёпта
 
Начинающий
Статус
Оффлайн
Регистрация
19 Июл 2024
Сообщения
136
Реакции[?]
0
Поинты[?]
0
а конкретнее? в джаве не шарю, но код выглядит чисто.. если есть какой то синтаксис покруче - показывай, ёпта
окси окси окси окси мирон пастер чего???!!!!!
а конкретнее? в джаве не шарю, но код выглядит чисто.. если есть какой то синтаксис покруче - показывай, ёпта
окси окси окси окси
 
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2021
Сообщения
521
Реакции[?]
53
Поинты[?]
20K
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2023
Сообщения
44
Реакции[?]
0
Поинты[?]
0
Что еще можно добавить или доработать ?
Для просмотра содержимого вам необходимо авторизоваться.

Java:
public class EventBus {

    private static final Map<Class<?>, Set<Listener<?>>> listenerMap = Maps.newHashMap();

    public static void setObjectStateListener(Object object, boolean state) {
        processFields(object, _ -> true, state);
    }
    
    public static void setObjectStateListener(Object object, Class<? extends Event> event, boolean state) {
        processFields(object, field -> {
            Class<?> fieldEvent = (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
            return event.equals(fieldEvent);
        }, state);
    }

    private static void processFields(Object object, Predicate<Field> fieldPredicate, boolean state) {
        Stream.of(object.getClass().getDeclaredFields())
                .filter(field -> field.getType().equals(Listener.class))
                .filter(fieldPredicate)
                .forEach(field -> {
                    boolean accessible = field.isAccessible();
                    try {
                        if (!accessible) {
                            field.setAccessible(true);
                        }
                        Listener<?> listener = (Listener<?>) field.get(object);
                        Class<?> event = (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
                        if (state) {
                            listenerMap.computeIfAbsent(event, _ -> new HashSet<>()).add(listener);
                        } else {
                            Set<Listener<?>> listenerSet = listenerMap.get(event);
                            if (listenerSet != null && !listenerSet.isEmpty()) {
                                listenerSet.remove(listener);
                            }
                        }
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    } finally {
                        if (accessible != field.isAccessible()) {
                            field.setAccessible(accessible);
                        }
                    }
                });
    }


    public static Map<Class<?>, Set<Listener<?>>> getListenerMap() {
        return new HashMap<>(listenerMap);
    }
}
 
Сверху Снизу