С интерфейсом вы можете использовать другие реализации позже, не меняя весь ваш код.Например, если вы используете интерфейс List, это может быть LinkedList, ArrayList, CopyOnWriteArrayList или что-то еще.
Вы делаете это ясно, детали реализации не важны.
С другой стороны, я бы не стал создавать интерфейс для каждого класса.В большинстве случаев добавление интерфейса позже, в маловероятном случае, когда оно действительно необходимо, не всегда является сложным.
Я бы использовал интерфейс, если вы хотите слабой связи, например, когда вызывающий абонент является другим модулем или используетсядругой разработчик.Если у вас тесная связь, как у локальной реализации пакета, я не буду беспокоиться об интерфейсе.
В приведенном выше примере вы можете добавить модульный тест, чтобы увидеть, какие значения установлены, или разработчик может захотетьиспользуйте буфер, который регистрирует, какие значения установлены.Использование интерфейса делает это проще.