После долгих голосов и немного погуглил ,
Благодаря Ярославу Павляку я нашел ответ на свой вопрос.
Ответ состоял в том, чтобы полностью отказаться от класса, показанного в моем вопросе, и заменить его на:
Список потребителей:
List<Consumer<String>> inputReceivers = new ArrayList<Consumer<String>>();
Теперь добавим потребителей:
public void addReceiver(Consumer<String> receiver) {
inputReceivers.add(receiver);
}
И срабатывает при событии:
for (Consumer<String> a : inputReceivers) {
a.accept("some string data");
}
Вот и все! Нет необходимости реализовывать какой-либо интерфейс или расширять абстрактный класс, это хорошо работает с методами.
Я могу сделать что-то вроде этого:
addReceiver(s -> {
if (!StringUtils.isAllBlank(s)) {
// deal with string s
}
});
Почти волшебство!