Що таке клас обгортки?


Відповіді:


171

Загалом, клас обгортки - це будь-який клас, який "обгортає" або "інкапсулює" функціональність іншого класу або компонента. Вони корисні, якщо забезпечують рівень абстракції від реалізації базового класу чи компонента; наприклад, класи обгортки, які обгортають компоненти COM, можуть керувати процесом виклику компонента COM, не турбуючи з ним код виклику. Вони також можуть спростити використання базового об'єкта за рахунок зменшення кількості задіяних точок інтерфейсу; Часто це робить більш безпечним використання основних компонентів.


15
Клас обгортки (як адаптер) використовується, коли обгортка повинна дотримуватися певного інтерфейсу і повинна підтримувати поліморфну ​​поведінку. З іншого боку, фасад використовується тоді, коли хочеться простіший або простіший інтерфейс для роботи.
Яду

3
У цій статті пропонується обгортка може бути корисним для створення строго певний проксі - сервер для пізнього пов'язаного класу: Можу чи я використовувати пізніше зв'язування ... . Чи дійсно це додаткове використання для обгортки, ніж описане вище Полом Соньє?
Тодд

1
@NirajanSingh Wrapper повторно використовує два вже існуючих інтерфейси і змушує один працювати з іншим. З іншого боку, фасад створює новий інтерфейс.
Аліреза

67

Тільки, що це звучить: клас, який "обгортає" функціональність іншого класу чи API в більш простий або просто інший API.

Див .: Шаблон адаптера , Фасадний малюнок


Так! Часто є синонімічним для фасаду візерунком. У багатьох документах з кодом я бачу очевидний метод "Фасад", описаний як "Обгортка до методу XX: yy" або трохи застереження на кшталт "Обгортка для XX :: yy метод з обробкою виключень".
Пітер Краусс

41

Класи обгортки забезпечують спосіб використання примітивних типів як об’єктів. Для кожного примітиву ми маємо клас обгортки, наприклад,

int Integer
byte Byte 

Integer і Byte - це класи обгортки примітивних int та byte. Існують часи / обмеження, коли вам потрібно використовувати примітиви як об’єкти, тому класи обгортки забезпечують механізм, який називається бокс / розпакування.

Концепція може бути добре зрозуміла на наступному прикладі як

double d = 135.0 d;
Double doubleWrapper = new Double(d);

int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();

Таким чином, ми можемо використовувати тип класу обгортки для перетворення в інші примітивні типи. Цей тип перетворення використовується, коли вам потрібно конвертувати примітивний тип в об'єкт і використовувати їх для отримання інших примітивів. Для цього підходу потрібно написати великий код. Однак цього можна досягти і за допомогою простої техніки кастингу, оскільки фрагмент коду може бути досягнутий, як показано нижче

double d = 135.0;
int integerValue = (int) d ;

Хоча подвійне значення явно перетворюється на ціле число, яке також називається низхідним мовленням.


1
Ваша відповідь передбачає, що класи обгортки призначені лише для примітивних об'єктів.
Гійом Ф.

17

Клас обгортки не обов'язково потрібно обертати іншим класом. Це може бути функція обгортання класу API, наприклад, у файлі dll.

Наприклад, може бути дуже корисним створити клас оболонки dll, який піклується про всі ініціалізації та очищення dll та створить методи класу, які обгортають функціональні вказівники, створені, наприклад GetProcAddress().

Ура!


8

Клас обгортки - це клас, який "обгортається" навколо чогось іншого, як і його назва.

Більш офіційним визначенням цього буде клас, який реалізує шаблон адаптера . Це дозволяє змінювати один набір API в більш зручну для читання форму. Наприклад, у C #, якщо ви хочете використовувати рідний API Windows, це допомагає перетворити його в клас, який відповідає керівництву щодо дизайну .NET.


2
На мій погляд на схему адаптера, вона відрізняється від обгортки: якщо X обгортає Y, то X має інкапсулювати стан Y, але не його ідентичність . Враховуючи два екземпляри X, обидва з яких обертають Y, не повинно бути засобів, за допомогою яких можна було б довести, що обидва екземпляри X обертають один і той же екземпляр Y. На противагу цьому, об'єкт-адаптер часто інкапсулює ідентичність, але не стан; зміна об'єкта, що адаптується, не вважатиметься зміною самого адаптера.
supercat


7

Також може бути корисним зазначити, що в деяких середовищах велика частина того, що можуть робити обгорткові класи, замінюється аспектами.

Редагувати:

Взагалі обгортка збирається розширити те, що робить wrappee, не піклуючись про реалізацію wrappee, інакше немає сенсу обгортати, а не подовжувати обернутий клас. Типовим прикладом є додавання інформації про синхронізацію чи функцію ведення журналу навколо іншого сервісного інтерфейсу, на відміну від додавання її до кожної реалізації цього інтерфейсу.

Потім це стає типовим прикладом програмування Aspect. Замість того, щоб переходити через функцію інтерфейсу за допомогою функції та додавати протокол журнальної панелі, в аспектному програмуванні ви визначаєте точку, яка є своєрідним регулярним виразом для методів, а потім оголошуєте методи, які ви хочете виконати до, після або навколо всіх методів узгодження точкова точка. Напевно, справедливо сказати, що аспектне програмування - це вид використання шаблону Decorator, для якого також можна використовувати класи обгортки, але що обидві технології мають інше використання.


7

Клас Wrapper - це клас, який обгортає інший клас і забезпечує абстрагування між клієнтом та оригінальним класом, який обгортається.


5

клас обгортки - це звичайно клас, який має об'єкт як приватну власність. обгортка реалізує API цього приватного об'єкта, і тому він може бути переданий як аргумент, куди буде приватний об'єкт.

скажімо, у вас є колекція, і ви хочете використовувати якийсь переклад, коли до неї додаються об’єкти - ви пишете клас обгортки, який має всі методи колекції. коли викликається add (), обгортка переводить аргументи, а не просто передає їх у приватну колекцію.

обгортку можна використовувати в будь-якому місці колекції, яку можна використовувати, а приватний об'єкт все ще може мати інші об'єкти, що посилаються на нього та читають його.


1
Погодьтеся, мій особистий погляд на обгортки полягає в тому, що вони виглядають і відчувають себе як оригінальний тип і можуть реалізувати той самий інтерфейс, що визначає утримання стану загорнутого екземпляра. Вони існують як спосіб "перехопити" дзвінки членам.
Люк Пуплетт

3

Клас обгортки - це клас, який використовується для обгортання іншого класу для додавання шару непрямості та абстракції між клієнтом та оригінальним класом, який обгортається.


3

Клас Wrapper - це обгортка навколо примітивного типу даних. Він представляє примітивні типи даних у відповідних екземплярах класу, наприклад, булевий тип даних може бути представлений як екземпляр булевого класу. Всі класи примітивної обгортки в Java незмінні, тобто коли присвоєне значення екземпляру класу обгортки не можна більше змінювати.


3

Програмування Java передбачає клас обгортки для кожного примітивного типу даних для перетворення примітивних типів даних у відповідність об'єкту класу обгортки.


1

Зробити благополуччя класу обгортки - непроста робота. Розуміти клас обгортки, як його розробляють деякі інші - теж не легка робота. Тому що це ідея, а не код. Тільки коли ви зрозумієте ідею, ви зможете зрозуміти обгортку.


0

Класи Wrapper виникли для того, щоб задовольнити основну потребу програмістів - тобто використовувати примітивні значення, де дозволено лише Об'єкти. Як випливає з їх назви, класи обгортки обгортають примітивне значення і містять значення в Об'єкті. Отже, усі ті місця, де примітивів не було дозволено - наприклад, дженерики, хешмап-ключі, Arraylists тощо - програмісти тепер мають можливість надати ці примітивні значення як їх відповідні типи обгортки.

Крім того, ці типи обгортки мають ряд корисних методів для перетворення з примітивного типу у відповідні типи обгортки та назад, а також із рядків у типи обгортки та назад.

Я написав детальну статтю про класи обгортки в своєму блозі, де пояснюється поняття типів обгортки по глибині - http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (Розкриття - Цей блог належить мені)


0

Наразі я використовував клас обгортки для свого проекту та основні переваги, які я отримую (лише одна користь для розширення пояснення теми):

Обробка винятків: Мій основний клас, який інший клас обгортає, має методи, які викидають винятки, якщо такі є, тому я створив клас обгортки, який обробляє винятки та негайно записує їх. Отже, в моєму основному обсязі не існує виключень поводження. Я просто викликаю метод і щось роблю.

Просте використання: Я легко ініціюю об'єкт. Зазвичай фаза ініціювання побудована з безлічі етапів.

Читання коду: Коли інший програміст відкриє мій код, він буде здаватися дуже зрозумілим і легким для маніпулювання.

Приховування деталей: Якщо ви генеруєте клас, який збирається використовувати інший програміст, тоді ви можете зафіксувати деталі на кшталт "обробка помилок, обробка винятків, повідомлення журналів тощо", так що програмісту не доведеться обробляти хаос, просто використовує методи.


0

Клас обгортки - це клас, який служить єдиною метою утримувати щось і додавати йому деяку функціональність. У Java, оскільки примітиви (наприклад, ints, floats, chars ...) не є об'єктами, тому якщо ви хочете ставитися до них як до одного, то вам доведеться використовувати обгортковий клас. Припустимо, ви хочете створити векторний ints, проблема полягає в тому, що вектор містить лише об'єкти, а не примітиви. Тож, що ви зробите, покладіть всі вкладиші в обгортку Integer і використовуйте це. Приклад:

int number = 5;
Integer numberWrapped = new Integer(number);
//now you have the int in an object.
//and this is how to access the int value that is being wrapped.
int again = numberWrapped.intValue();

Це відоме як боксерські примітиви, а не обгортання.
кіборг

-8

обгортка - це клас, який використовується для зв'язку між двома різними програмами між різними платформами


Я думаю, ви можете використовувати його набагато більше, ніж просто один випадок
Flexo

1
Дійсно, це лише один невеликий випадок використання.
прасеодим

Я думаю, це визначення веб-сервісів
Bahadir Tasdemir
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.