Автоматическая регистрация объектов с методами-ресиверами событий

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.7.10

mayakplay

SpringFlomaster
217
3
160
Проблема: С ростом мода разрастается количество обработчиков событий мейн превращается в блевотную последовательность регистрации кучи обработчиков событий.

Есть ли на форуме умельцы, которые сделали автоматическую регистрацию своих классов, как EventHandler?

Вопрос из личного интереса
Отмечу лучшим ответом самое интересное решение


Код:
MinecraftForge.EVENT_BUS.register(someInstance);
FMLCommonHandler.instance().bus().register(someInstance);
 
Последнее редактирование:
Решение
Ну как тебе сказать))

Java:
@ForgeEventHandler
public class IngameUiService implements IIngameUiService {

    private final List<AbstractIngameUiLayer> layers;

    @Autowired
    public IngameUiService(List<AbstractIngameUiLayer> layers) {
        this.layers = layers;
    }
...
Наворотят всякого, а потом неудобно им. Полюбому ж из этого класса будет создавать объект, что мешает у него в конструкторе написать EVENT_BUS.register(this)?
Объясняю правила игры.
Если ты объяснишь мне где я не прав, мне станет стыдно а тебе +20rep. При этом я стану чуточку умней и люди которые прочитают станут чуточку умней. Если же ты остановишься на этом, мое последнее слово будет примерно как твое: "этот чел просто понял, что не прав и щас не может найти убедительных аргументов в свою пользу". Если тебя устраивает, то окей.
 
Объясняю правила игры.
Это потрясно! Ждал подобного сообщения!

Сравнивать guice со спрингом - действительно неправильно, ведь спринг - огромная инфраструктура, которая дает просто дохера функционала , проста и понятна, плюсом имеется огромное комьюнити, что ведет за собой кучу гайдов и поддержки. И что говорить о Guice, которая просто небольшая либа для инъекции зависимостей. Я нарисовал фановый график, который показывает, как гис относится к спрингу)


1553629860234.png
Можно использовать guice в некоторый случаев, но примеры где он справился бы лучше спринга я припомнить не могу)
В спринге Di реализовано лучше, ну это, конечно, личное мнение)

Ну и мое решение, собственно. Не стал бы я просто так топить за спринг))
Код:
@Component
public class ForgeEventHandlerRegistryBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean.getClass().getDeclaredAnnotation(ForgeEventHandler.class) != null) {
            MinecraftForge.EVENT_BUS.register(bean);
            FMLCommonHandler.instance().bus().register(bean);
        }
        return bean;
    }
}
 
Последнее редактирование:
Ну как тебе сказать))
Дак конструктор же пустой
Java:
@ForgeEventHandler
public class IngameUiService implements IIngameUiService {

    private final List<AbstractIngameUiLayer> layers;

    @Autowired
    public IngameUiService(List<AbstractIngameUiLayer> layers) {
        this.layers = layers;
    }
...
 
Это потрясно! Ждал подобного сообщения!

Сравнивать guice со спрингом - действительно неправильно, ведь спринг - огромная инфраструктура, которая дает просто дохера функционала , проста и понятна, плюсом имеется огромное комьюнити, что ведет за собой кучу гайдов и поддержки. И что говорить о Guice, которая просто небольшая либа для инъекции зависимостей. Я нарисовал фановый график, который показывает, как гис относится к спрингу)


Посмотреть вложение 5005
Можно использовать guice в некоторый случаев, но примеры где он справился бы лучше спринга я припомнить не могу)
В спринге Di реализовано лучше, ну это, конечно, личное мнение)

Ну и мое решение, собственно. Не стал бы я просто так топить за спринг))
Код:
@Component
public class ForgeEventHandlerRegistryBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean.getClass().getDeclaredAnnotation(ForgeEventHandler.class) != null) {
            MinecraftForge.EVENT_BUS.register(bean);
            FMLCommonHandler.instance().bus().register(bean);
        }
        return bean;
    }
}
мех
Начнем с того что тут нет ничего про dependency injection. Продолжим тем что тут есть Component, а так же вспомним каким образом ищутся классы с такой аннотацией, и отметим, что этот способ намного менее оптимален, чем использование ASM таблиц, добытых форджем.
И чо ты тут доказал?
 
Ну как тебе сказать))

Java:
@ForgeEventHandler
public class IngameUiService implements IIngameUiService {

    private final List<AbstractIngameUiLayer> layers;

    @Autowired
    public IngameUiService(List<AbstractIngameUiLayer> layers) {
        this.layers = layers;
    }
...
Ладно это уже по-лучше. Пройдемся же по но:
1) Мы уже определились, что бинсы спринга нам юзать не с руки, а тащить их как то не с руки и не только из-за размера.
2) Спринг инжекшены и гуисе инжекшены все же отличаются чутка: гуисе по круче будет
 
отметим, что этот способ намного менее оптимален чем использование ASM таблиц
Вся оптимальность, о которой идет речь, находится на стадии загрузки, клиента, что минимально критично. АСМ работает на старте загрузки майна, только работает он с джарниками, перед тем, как они помещаются в мод контейнер, спринг, который, лучше всего, будет подключать в констракт эвенте, отработает при старте майна, подняв свой контекст, незаметно для юзера, в этот момент спринг перестает давать нагрузку на систему, ибо хранятся бины (синглтоны) в объчной хешмапе, называемой модно "IOC Container" ;)
 
Ну как тебе сказать))

Java:
@ForgeEventHandler
public class IngameUiService implements IIngameUiService {

    private final List<AbstractIngameUiLayer> layers;

    @Autowired
    public IngameUiService(List<AbstractIngameUiLayer> layers) {
        this.layers = layers;
    }
...
Наворотят всякого, а потом неудобно им. Полюбому ж из этого класса будет создавать объект, что мешает у него в конструкторе написать EVENT_BUS.register(this)?
 
Вся оптимальность, о которой идет речь, находится на стадии загрузки, клиента, что минимально критично. АСМ работает на старте загрузки майна, только работает он с джарниками, перед тем, как они помещаются в мод контейнер, спринг, который, лучше всего, будет подключать в констракт эвенте, отработает при старте майна, подняв свой контекст, незаметно для юзера, в этот момент спринг перестает давать нагрузку на систему, ибо хранятся бины (синглтоны) в объчной хешмапе, называемой модно "IOC Container" ;)
Нет, прости, это не так работает. Если каждый начнет таким грешить, произойдет трындец. Даже если один начнет таким заниматься, уже не хорошо. Особенно в больших мод паках. Поверь я знаю о чем говорю, и большинство олдов на этом форуме тебе за такое руки отрубят.
 
"Давай я напишу, что какая-то вещь круче, не объясняя, почему она круче :)"
Да как минимум не нужен xml вонюче, а есть прекрасный language embeded domain specific language, но это не важно так как альтернатив то нет, как мы определились.
 
Нет, прости, это не так работает
"Объясняю правила игры.
Если ты объяснишь мне где я не прав, мне станет стыдно а тебе +20rep. При этом я стану чуточку умней и люди которые прочитают станут чуточку умней. Если же ты остановишься на этом, мое последнее слово будет примерно как твое: "этот чел просто понял, что не прав и щас не может найти убедительных аргументов в свою пользу". Если тебя устраивает, то окей. "
 
"Объясняю правила игры.
Если ты объяснишь мне где я не прав, мне станет стыдно а тебе +20rep. При этом я стану чуточку умней и люди которые прочитают станут чуточку умней. Если же ты остановишься на этом, мое последнее слово будет примерно как твое: "этот чел просто понял, что не прав и щас не может найти убедительных аргументов в свою пользу". Если тебя устраивает, то окей. "
Ты щас вызвал ядерный разрыв моего пукана
Что ж объясняю. ЭТО МЕДЛЕННО. Если это делаешь только ты это МЕДЛЕННО один раз. Если это делаешь не только ты это ОЧЕНЬ МЕДЛЕННО. Твой мод будет использоваться не только на сервере которому обычно похер на скорость загрузки, а еще и на клиенте. И мне лично не по кайфу будет ждать 5 лишних минут пока твой мод проверит все классы в класс пазе ради сомнительных бинов. А у меня комп весьма неплохой еще, у некоторых бывает куда хуже. О них ты думать не хочешь?
 
Тут ты доказал, что ты говоришь о том, в чем не разбираешься ;)
может быть
со спрингом я почти не работал
с гуисом я работал тесно только когда торренты писал
в любом случае это тебя не спасет
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху