Ещё вариант пришёл в голову. Сделать Provider иммутабельным. Но, конечно, тогда не так явно.
Опять будет нарушение интерфейса. Вариант с передачей коллекции в конструктор самое то. Закрывает твою потребность добавлять листенеры через attach и не дает конфижить рантайм.
Если мы декларируем следование паттерну depenedency injection, то мы должны придерживаться два простых правила: 1. Однин класс - один интерфейс. 2. Все публичные методы класса являются частью интерфейса.