Как реализация скелета отличается от обычного абстрактного класса?

В Эффективной Java Джошуа Блох выступает за интерфейсы над абстрактными классами. Тем не менее, он отмечает, что реализация скелета должна сопровождаться каждым интерфейсом.

Я чувствую, что скелетная реализация почти такая же, как абстрактный класс. Как отличаются эти два понятия?

Ответ 1

Отредактировано после повторного чтения вышеупомянутого раздела в "Эффективной Java"

В соответствии с этим разделом книги скелетная реализация является абстрактным классом. Он рекомендует этот подход, потому что после реализации скелетной реализации становится тривиальным реализовывать интерфейс и выборочно переопределять методы даже с анонимным классом (как он это делает в своей книге).


Предыдущий ответ, слегка отредактированный для непрерывности

Скелетная реализация теоретически может быть полной реализацией и, следовательно, конкретной. Затем его можно использовать с composition, поскольку он может быть создан. В то время как абстрактные классы требуют наследования.

Ответ 2

Он имеет в виду, что вы должны предоставить интерфейс и абстрактный класс, реализующий части этого интерфейса:

public interface Foo {
    void bar();
    void baz();
}

private abstract class AbstractFoo implements Foo {
    ...
}

Класс AbstractFoo может быть даже не абстрактным, если можно обеспечить базовую, полную реализацию. Но если вам нужен класс, который является Foo, но не может расширить AbstractFoo, он по-прежнему возможен с интерфейсом. Абстрактный класс не предоставляет эту возможность, поскольку вы можете расширить только один класс.

Кстати, это то, что сделано в рамках коллекций (созданный Джошем Блохом): интерфейс Set реализован AbstractSet, интерфейс List реализован AbstractList и т.д.

Ответ 3

Интерфейс/абстрактный класс является частью API.

Скелетная реализация является действительным конкретным class, но ограничена/наивна/плохая реализация; для (очень надуманного) примера, скелетная реализация интерфейса Sorter может реализовать тип пузыря - вы не захотите использовать его в производственное приложение, но оно иллюстрирует, как можно реализовать интерфейс

Ответ 4

Я чувствую, что скелетная реализация почти такая же, как у абстрактный класс. Как отличаются эти два понятия?

Для меня они отличаются намерениями. Когда я вижу, какой-то метод предполагает, что интерфейс будет передан, я знаю, что реализация зависит от меня. Если класс возвращается, я не уверен. Просто смысл использования интерфейса, который не существует для класса.

Кроме того, методы, которые принимают классы для аргументов, конфликтуют, когда класс, который мы хотели бы передать, уже является подклассом; Java не поддерживает множественное наследование. Интерфейсы не имеют этой проблемы.

Ответ 5

"Скелетная реализация" - это конкретный класс: вы можете скомпилировать и протестировать его.

Абстрактный класс не является, и вы не можете;)