Выбор ответа Senior ООП и класс Object обновлено
Почему Stack extends Vector плохо
Вопрос
В чём главная проблема java.util.Stack extends Vector, на которую ссылаются, говоря «композиция лучше наследования»?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Стек унаследовал весь API вектора, и add(index, e) ломает его инвариант. Наследование публикует весь интерфейс родителя: у стека есть add(int, E), remove(int), get(int), и клиент может вставить элемент в середину, сломав семантику LIFO.
Варианты ответа
- Наследование от Vector делает стек медленнее, чем ArrayDeque, из-за виртуальных вызовов
- Vector объявлен final, поэтому Stack пришлось делать через хаки рефлексии
- Наследники Vector нельзя сериализовать, поэтому Stack не передать по сети
- Стек унаследовал весь API вектора, и
add(index, e)ломает его инвариантправильный ответ
Разбор
Наследование публикует весь интерфейс родителя: у стека есть add(int, E), remove(int), get(int), и клиент может вставить элемент в середину, сломав семантику LIFO. С композицией стек держал бы список в private-поле и показывал только push/pop/peek. Медленнее Stack из-за синхронизации методов Vector, а не из-за виртуальных вызовов. Vector не final, проблем с сериализацией нет. Сегодня для стека берут ArrayDeque.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.