Java расширить или обернуть класс, чтобы добавить дополнительную функциональность - PullRequest
6 голосов
/ 28 января 2010

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

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

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

и пара методов:

Boolean isNextPageAvailable();
Boolean isPrevPageAvailable();

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

Ответы [ 6 ]

8 голосов
/ 28 января 2010

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

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

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

1 голос
/ 28 января 2010

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

0 голосов
/ 28 января 2010

Адекватный подход - иметь элегантный PagingList (расширяющий список).

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

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

0 голосов
/ 28 января 2010

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

...