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

Статус
В этой теме нельзя размещать новые ответы.
Версия 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)?
1,111
47
420
Объясняю правила игры.
Если ты объяснишь мне где я не прав, мне станет стыдно а тебе +20rep. При этом я стану чуточку умней и люди которые прочитают станут чуточку умней. Если же ты остановишься на этом, мое последнее слово будет примерно как твое: "этот чел просто понял, что не прав и щас не может найти убедительных аргументов в свою пользу". Если тебя устраивает, то окей.
 

mayakplay

SpringFlomaster
217
3
160
Объясняю правила игры.
Это потрясно! Ждал подобного сообщения!

Сравнивать 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;
    }
}
 

mayakplay

SpringFlomaster
217
3
160
Последнее редактирование:

mayakplay

SpringFlomaster
217
3
160
Ну как тебе сказать))
Дак конструктор же пустой
Java:
@ForgeEventHandler
public class IngameUiService implements IIngameUiService {

    private final List<AbstractIngameUiLayer> layers;

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

Сравнивать 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 таблиц, добытых форджем.
И чо ты тут доказал?
 
1,111
47
420
Ну как тебе сказать))

Java:
@ForgeEventHandler
public class IngameUiService implements IIngameUiService {

    private final List<AbstractIngameUiLayer> layers;

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

mayakplay

SpringFlomaster
217
3
160
отметим, что этот способ намного менее оптимален чем использование ASM таблиц
Вся оптимальность, о которой идет речь, находится на стадии загрузки, клиента, что минимально критично. АСМ работает на старте загрузки майна, только работает он с джарниками, перед тем, как они помещаются в мод контейнер, спринг, который, лучше всего, будет подключать в констракт эвенте, отработает при старте майна, подняв свой контекст, незаметно для юзера, в этот момент спринг перестает давать нагрузку на систему, ибо хранятся бины (синглтоны) в объчной хешмапе, называемой модно "IOC Container" ;)
 

mayakplay

SpringFlomaster
217
3
160

tox1cozZ

aka Agravaine
8,455
598
2,892
Ну как тебе сказать))

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)?
 

mayakplay

SpringFlomaster
217
3
160
1,111
47
420
Вся оптимальность, о которой идет речь, находится на стадии загрузки, клиента, что минимально критично. АСМ работает на старте загрузки майна, только работает он с джарниками, перед тем, как они помещаются в мод контейнер, спринг, который, лучше всего, будет подключать в констракт эвенте, отработает при старте майна, подняв свой контекст, незаметно для юзера, в этот момент спринг перестает давать нагрузку на систему, ибо хранятся бины (синглтоны) в объчной хешмапе, называемой модно "IOC Container" ;)
Нет, прости, это не так работает. Если каждый начнет таким грешить, произойдет трындец. Даже если один начнет таким заниматься, уже не хорошо. Особенно в больших мод паках. Поверь я знаю о чем говорю, и большинство олдов на этом форуме тебе за такое руки отрубят.
 
1,111
47
420
"Давай я напишу, что какая-то вещь круче, не объясняя, почему она круче :)"
Да как минимум не нужен xml вонюче, а есть прекрасный language embeded domain specific language, но это не важно так как альтернатив то нет, как мы определились.
 

mayakplay

SpringFlomaster
217
3
160
Нет, прости, это не так работает
"Объясняю правила игры.
Если ты объяснишь мне где я не прав, мне станет стыдно а тебе +20rep. При этом я стану чуточку умней и люди которые прочитают станут чуточку умней. Если же ты остановишься на этом, мое последнее слово будет примерно как твое: "этот чел просто понял, что не прав и щас не может найти убедительных аргументов в свою пользу". Если тебя устраивает, то окей. "
 

mayakplay

SpringFlomaster
217
3
160
1,111
47
420
"Объясняю правила игры.
Если ты объяснишь мне где я не прав, мне станет стыдно а тебе +20rep. При этом я стану чуточку умней и люди которые прочитают станут чуточку умней. Если же ты остановишься на этом, мое последнее слово будет примерно как твое: "этот чел просто понял, что не прав и щас не может найти убедительных аргументов в свою пользу". Если тебя устраивает, то окей. "
Ты щас вызвал ядерный разрыв моего пукана
Что ж объясняю. ЭТО МЕДЛЕННО. Если это делаешь только ты это МЕДЛЕННО один раз. Если это делаешь не только ты это ОЧЕНЬ МЕДЛЕННО. Твой мод будет использоваться не только на сервере которому обычно похер на скорость загрузки, а еще и на клиенте. И мне лично не по кайфу будет ждать 5 лишних минут пока твой мод проверит все классы в класс пазе ради сомнительных бинов. А у меня комп весьма неплохой еще, у некоторых бывает куда хуже. О них ты думать не хочешь?
 
1,111
47
420
Тут ты доказал, что ты говоришь о том, в чем не разбираешься ;)
может быть
со спрингом я почти не работал
с гуисом я работал тесно только когда торренты писал
в любом случае это тебя не спасет
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху