Смысл интерфейса в том, чтобы позволить реализации меняться, не влияя на вызывающих.
В вашем примере вызывающий withPrefix()
может не предполагать, что он возвращает PrefixFooImpl
, он может только предполагать Foo
.
Даже в примере supercat , AsImmutableEnumerable()
не "утечет" детали реализации, что означает, что изменение не повлияет на вызывающих.
Все это, конечно, предполагает, что если какой-то вызывающий объект решит преобразовать результат withPrefix()
в конкретную c реализацию, будь то PrefixFooImpl
или что-то еще, он не будет жаловаться при изменении .
Другая сторона, конечно, фактически позволяет изменять реализацию.
Опять же, с примером Foo
, реализация всегда может переопределить withPrefix()
, так что пока интерфейс не расширяется методами по умолчанию, все по-прежнему хорошо.
Если интерфейс расширяется методами по умолчанию после того, как Foo
уже имеет существующие реализации (которые работают не переопределяя новые методы), тогда методы по умолчанию должны позаботиться о том, чтобы объект, который ожидает вызывающий объект, все еще демонстрировал поведение, намеченное тем, кто создавал реализацию (например, вы не можете вернуть клиент MySQL из реализации PostgreSQL клиента).
В вашем примере объект, который ожидает вызывающая сторона, проксирует исходный объект. Другая реализация может просто вернуть исходный объект. Это все допустимые поведения.
Таким образом, выполнение подобных вещей не является нарушением абстракции, предоставляемой интерфейсом. На самом деле выполнение этого строго для удобства syntacti c приводит к усложнению кода и усложнению. отладка.
Если мы возьмем пример Foo
снова, вызов withPrefix()
10 раз создаст цепочку из 11 объектов. Помимо влияния на G C, представьте себе сложную реализацию PrefixFooImpl
- то, что говорит с внешним миром (например, DnsResolvingFooProxy
, который разрешает bar
в качестве имени хоста в IP-адрес).
Или представьте два метода, asIpAddress()
и resolveLoadBalance()
, каждый из которых ссылается на свою реализацию .
В заключение, это не нарушение абстракции, но если вы его используете, очень рассудительно об этом.