java расширяет или обертывает класс для добавления дополнительных функций

когда вы хотите добавить дополнительную информацию в класс, какой способ вы бы предпочли: вы расширили бы этот класс или сделали обертку вокруг него?

в моем конкретном сценарии я хочу добавить некоторую информацию о разбиении на страницы с помощью List что я получаю из базы данных. Эта информация о разбиении на страницы будет включать:

int currentPage;
int totalResults;
int containedResultsIndex;
int totalcontainedResults;

и несколько методов:

Boolean isNextPageAvailable();
Boolean isPrevPageAvailable();

каково Ваше мнение, расширить или обернуть?

6 ответов


  • в вашем случае оберните существующий List и сделайте свой класс implement List сам, делегируя все методы исходному списку (который передается в конструкторе, например)
  • наследование не всегда неправильно, но в этом случае вы не будете знать, какой класс расширить - будет ли это ArrayList или LinkedList ?

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


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


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


даже если вы расширяете, вы не сможете вызвать новые методы через ссылку на супер класс. Лучше всего просто завернуть его.


наличие элегантного PagingList (расширение списка) является адекватным подходом.

  • зачем делегировать, когда вы можете наследовать то, что вам нужно?

  • Это похоже на отношения между FileReader и BufferedFileReader ( и никто не сказал бы, что это плохая практика).