Создание слушателя для этих трех событий было бы лучшим подходом, если бы вы хотели сделать доступ к этим событиям общедоступным, потому что это обеспечивает гораздо более высокую степень разъединения между классом и его слушателями.
Созданиезащищенный доступ подразумевает более высокую степень соответствия между классом и слушателем: разработчики класса в конечном итоге создали бы защищенный RunnerListener
интерфейс для слушателя, добавив защищенную DefaultRunnerListener
реализацию для ситуаций, когда вам нужно переопределить один илидва метода и добавление защищенного метода для вас, чтобы предоставить слушателю.Поскольку доступ к такому слушателю также будет защищен, вы не сможете использовать для него фабричный метод.
Принимая все это во внимание, авторы решили, что проще будет предоставить защищенные методы,вместо того, чтобы добавлять сложность выше для разъединения, в котором нет необходимости.