Выбор ответа Senior ООП и класс Object обновлено

Почему Stack extends Vector плохо

Вопрос

В чём главная проблема java.util.Stack extends Vector, на которую ссылаются, говоря «композиция лучше наследования»?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Стек унаследовал весь API вектора, и add(index, e) ломает его инвариант. Наследование публикует весь интерфейс родителя: у стека есть add(int, E), remove(int), get(int), и клиент может вставить элемент в середину, сломав семантику LIFO.

Варианты ответа

  1. Наследование от Vector делает стек медленнее, чем ArrayDeque, из-за виртуальных вызовов
  2. Vector объявлен final, поэтому Stack пришлось делать через хаки рефлексии
  3. Наследники Vector нельзя сериализовать, поэтому Stack не передать по сети
  4. Стек унаследовал весь API вектора, и add(index, e) ломает его инвариантправильный ответ

Разбор

Наследование публикует весь интерфейс родителя: у стека есть add(int, E), remove(int), get(int), и клиент может вставить элемент в середину, сломав семантику LIFO. С композицией стек держал бы список в private-поле и показывал только push/pop/peek. Медленнее Stack из-за синхронизации методов Vector, а не из-за виртуальных вызовов. Vector не final, проблем с сериализацией нет. Сегодня для стека берут ArrayDeque.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.