Являются ли абстрактные классы любого использования в Java 8 [duplicate]

1

Я читал несколько статей о новых функциях Java 8. С внедрением методов расширения, т.е. методов с префиксом ключевого слова по умолчанию и обеспечения реализации.

Я проверил пару вопросов здесь, где люди задавали вопрос о различиях в абстрактных классах и интерфейсах, таких как здесь и здесь, и самое большое различие, по-видимому, в том, что абстрактные классы позволяли вам указывать реализации по умолчанию.

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

Я вижу, что абстрактные классы здесь, чтобы остаться, прежде всего для того, чтобы быть обратно совместимыми со старым кодом. Будет ли я прав, если не использовать абстрактные классы в будущем и использовать только интерфейсы? Если бы вы не представили пример, то просто наличие некоторых полей, определенных в абстрактном классе, не учитывается. Я ищу убедительный пример использования, когда абстрактные классы по-прежнему лучше подходят по сравнению с интерфейсами.

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

  • 1
    Они, конечно, недостаточно похожи, чтобы сделать абстрактные классы бесполезными.
  • 1
    Я чувствую, что это не вопрос. Интерфейсы и абстрактные классы - это два разных инструмента, оба из которых необходимы в наборе инструментов. Отвертка с плоской головкой МОЖЕТ использоваться для того, чтобы вкручивать винты Philips. Должен ли я для этого бросить мою отвертку Philips? Дело вроде как спорный имо.
Теги:
java-8
oop
interface
abstract-class

1 ответ

9
Лучший ответ

Абстрактные классы могут иметь конструкторы и состояния. Даже при использовании методов расширения интерфейс не может иметь никакого состояния. Например, вам понадобится класс Abstract для чего-то вроде моделирования базового состояния "size" для метода #getSize или #setSize.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню