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

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

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

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

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

Boolean isNextPageAvailable();
Boolean isPrevPageAvailable();

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

7
задан Bozho 19 April 2011 в 07:17
поделиться

6 ответов

  • В вашем случае обертывают существующий список и сделайте свой класс реализовать список , делегируя все методы в исходном списке (который передается в конструктор Например)
  • Наследование наследство не всегда не так, но в этом случае вы не будете знать, каким классом продлен - будет ли он ArrayList , или LinkedList ?
4
ответ дан 6 December 2019 в 11:49
поделиться

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

3
ответ дан 6 December 2019 в 11:49
поделиться

Современные процессоры, которые реализуют 64-битные плавающие-точки, как правило, реализуют то, что близко к стандарту IEEE 754-1985, недавно вытесненные стандартом 754-2008.

Стандарт 754 указывает, какой результат вы должны получить от определенных основных операций, в том числе добавление, вычитание, умножение, разделение, квадратный корню и отрицание. В большинстве случаев числовой результат указан именно: результатом должен быть представимый номер, который ближе всего к точному математическому результату в направлении, указанном в режиме округления (к ближайшему, к бесконечности, к нулю или к негативной бесконечности). В режиме «До ближайшего» стандарт также указывает, как сломаны галстуки.

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

Однако есть несколько вопросов, которые мешают получать идентичные результаты на разных процессорах. Одним из них является то, что компилятор часто свободен реализовать последовательности операций с плавающей точкой различными способами. Например, если вы пишете «a = b C + D» в C, где все переменные объявлены двойным, компилятор свободен вычислить «B C» в одноточной арифметике или что-то с большей диапазон или точность. Если, например, процессор имеет регистры, способные удерживать количество плавающих точек с плавающей точкой расширенной точностью, и выполнение арифметики с расширенной точкой не требует большего количества процессоров, чем выполнение арифметики с двойной точкой, компилятор может генерировать код с использованием расширенного -точность. На таком процессоре вы можете не получить те же результаты, что и вы на другом процессоре. Даже если компилятор делает это регулярно, он может не в некоторых обстоятельствах, потому что регистры заполнены во время сложной последовательности, поэтому она временно хранит промежуточные результаты в памяти временно. Когда это делает это, он может написать только 64-битный двойной, а не номер расширенного точности. Таким образом, рутина, содержащая арифметику с плавающей точкой, может дать разные результаты только потому, что она была скомпилирована с другим кодом, возможно, включена в одном месте, а компилятор нужны регистры для чего-то другого.

Некоторые процессоры имеют инструкции по вычислинию умножения и добавления в одну инструкцию, поэтому «B C + D» могут быть вычислены без промежуточного округа и получить более точный результат, чем на процессоре, который первый вычисляет B C а затем добавляет d.

Ваш компилятор может иметь переключатели для управления поведением.

Есть несколько мест, где стандарт 754-1985 не требует уникального результата. Например, при определении того, произошло ли предпринятое, а результат слишком мал, чтобы быть точно представленным точным), стандарт позволяет внедрять определение либо до, либо после того, как он расторгнет показатель (доля доли) к целевой точности. Таким образом, некоторые реализации скажут вам, что onlowflow произошел, когда не будут.

Общая особенность в процессорах состоит в том, чтобы иметь режим «почти IEEE 754», который устраняет трудности с недовольством, заменяя ноль вместо того, чтобы возвращать очень небольшое число, которое требует стандарта. Естественно, вы получите разные номера при выполнении в таком режиме, чем при выполнении в более совместимом режиме. Несоведочный режим может быть установлен по умолчанию для вашего компилятора и / или операционной системы по причинам производительности.

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

Когда вы выходите за пределы основных арифметических операций к вещам, как синус и косинус, вы очень зависимы от используемой библиотеки. Трансцендентные функции обычно рассчитываются с тщательно спроектированными приближениями. Реализации разработаны независимо различными инженерами и получают разные результаты друг от друга. В одной системе функция SIN может дать точные результаты в пределах ULP (единица измерения наименьших прецизионов) для небольших аргументов (меньше, чем Pi или SO), но большие ошибки для больших аргументов. В другой системе функция SIN может дать точные результаты в нескольких ULP для всех аргументов. Никакой текущей математической библиотеки не известен правильно округлыми результатами для всех входов. Существует проект, Crlibm (правильно округлая LIBM), который сделал некоторую хорошую работу по этой цели, и они разработали реализации для значительных частей математической библиотеки, которые правильно округлые и имеют хорошую производительность, но не все в библиотеке математики все же.

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

-121--3101602-

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

0
ответ дан 6 December 2019 в 11:49
поделиться

Наличие элегантного PageList (продлевающий список) - это адекватный подход.

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

  • Это похоже на взаимосвязь между Fileereader и буферигеремфилерером (и никто не скажет, что это плохое практика).

0
ответ дан 6 December 2019 в 11:49
поделиться

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

1
ответ дан 6 December 2019 в 11:49
поделиться

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

9
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: