Что такое класс-обёртка?

Ответы:

171

В общем случае класс-оболочка - это любой класс, который «оборачивает» или «инкапсулирует» функциональность другого класса или компонента. Они полезны, обеспечивая уровень абстракции от реализации базового класса или компонента; например, классы-обертки, которые обертывают компоненты COM, могут управлять процессом вызова компонента COM, не беспокоясь о вызывающем коде. Они также могут упростить использование базового объекта за счет уменьшения количества задействованных точек интерфейса; часто это обеспечивает более безопасное использование базовых компонентов.

Пол Сонье
источник
15
Класс оболочки (как адаптер) используется, когда оболочка должна учитывать определенный интерфейс и поддерживать полиморфное поведение. С другой стороны, фасад используется, когда требуется более простой или простой интерфейс для работы.
Яду
3
В этой статье предлагается обертка может быть полезным для создания строго определенный прокси - сервер для позднего связанного класса: Могу ли я использовать позднее связывание ... . Является ли это допустимым дополнительным использованием для оберток помимо того, что Пол Сонье описал выше?
Тодд
1
@NirajanSingh Wrapper повторно использует два уже существующих интерфейса и заставляет один работать с другим. С другой стороны, фасад создает новый интерфейс.
Алиреза
67

Как это звучит: класс, который «оборачивает» функциональность другого класса или API в более простой или просто другой API.

См .: Адаптерный рисунок , Фасадный рисунок

Shog9
источник
Да! Зачастую синоним для Фасадного паттерна. Во многих документах кода я вижу очевидный метод Facade, описываемый как «метод Wrapper to XX :: yy» или небольшую рекламу типа «метод Wrapper to XX :: yy с обработкой исключений».
Питер Краусс
41

Классы Wrapper предоставляют способ использовать примитивные типы в качестве объектов. Для каждого примитива у нас есть класс-обертка, такой как,

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 ;

Хотя двойное значение явно преобразуется в целочисленное значение, также называемое понижением.

SBTec
источник
1
Ваш ответ подразумевает, что классы-обертки предназначены только для примитивных объектов.
Гийом Ф.
17

Класс-обертка не обязательно должен оборачивать другой класс. Это может быть функциональность обёртывания класса API, например, в файле dll.

Например, может быть очень полезно создать класс-оболочку dll, который позаботится обо всей инициализации и очистке dll, а также создать методы класса, которые переносят указатели на функции, созданные, например, из GetProcAddress().

Ура!

ralphtheninja
источник
8

Класс-обертка - это класс, который «оборачивает» что-то еще, как и его имя.

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

Рид Копси
источник
2
Насколько я понимаю, шаблон адаптера отличается от оболочки: если X упаковывает Y, то X должен инкапсулировать состояние Y, но не его идентичность . Учитывая два экземпляра X, оба из которых обертывают Y, не должно быть никаких средств, с помощью которых можно было бы доказать, что оба экземпляра X обертывают один и тот же экземпляр Y. Напротив, объект адаптера часто инкапсулирует идентичность, но не состояние; изменение адаптируемого объекта не будет считаться изменением самого адаптера.
Суперкат
7

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

РЕДАКТИРОВАТЬ:

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

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

Jherico
источник
7

Класс Wrapper - это класс, который оборачивает другой класс и обеспечивает абстракцию между клиентом и исходным классом, который оборачивается.

Ракеш верма
источник
5

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

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

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

Амир Арад
источник
1
Согласитесь, мой личный взгляд на упаковщики заключается в том, что они выглядят и чувствуют себя как исходный тип и могут реализовывать тот же интерфейс, определенно сохраняя состояние упакованного экземпляра. Они существуют как способ «перехватывать» звонки участникам.
Люк Пуплетт
3

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

Эндрю Хэйр
источник
3

Класс Wrapper - это оболочка вокруг примитивного типа данных. Он представляет примитивные типы данных в соответствующих им экземплярах классов, например, булев тип данных может быть представлен как экземпляр булева класса. Все примитивные классы-обертки в Java являются неизменяемыми, т. Е. После присвоения значения экземпляру класса-обертки дальнейшее изменение невозможно.

Дэвид
источник
3

Java-программирование предоставляет класс-оболочку для каждого примитивного типа данных, чтобы преобразовать примитивные типы данных в соответствующий объект класса-оболочки.

ТЕМ ПЕША
источник
1

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

Тони
источник
0

Классы Wrapper появились для удовлетворения основных потребностей программистов - то есть для использования примитивных значений везде, где разрешены только объекты. Как следует из их названия, классы-обертки оборачиваются вокруг примитивного значения и содержат значение в объекте. Таким образом, все те места, где примитивы были запрещены - такие как обобщенные элементы, ключи хеш-карты, массивы и т. Д. - программисты теперь имеют возможность предоставлять эти примитивные значения в качестве соответствующих им типов оболочки.

Кроме того, эти типы оболочек имеют ряд служебных методов для преобразования из примитивного типа в соответствующие типы оболочек и обратно, а также из строк в типы оболочек и обратно.

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

Дхрув Рай Пури
источник
0

В настоящее время я использовал класс-оболочку для своего проекта и основные преимущества, которые я получаю (только одно преимущество, чтобы расширить описание темы):

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

Простое использование: я могу легко инициировать объект. Обычно начальная фаза состоит из множества шагов.

Читаемость кода: когда другой программист откроет мой код, код будет казаться очень понятным и простым в управлении.

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

Бахадир Тасдемир
источник
0

Класс-обертка - это класс, который служит единственной цели - удерживать что-то и добавлять к нему некоторую функциональность. В Java, поскольку примитивы (например, int, float, chars ...) не являются объектами, поэтому, если вы хотите обращаться с ними как с одним, тогда вы должны использовать класс-оболочку. Предположим, вы хотите создать вектор целых, проблема в том, что вектор содержит только объекты, а не примитивы. Итак, что вы будете делать, это поместить все целые числа в упаковщик 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

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

Laxminarayan
источник
Я думаю, что вы можете использовать его для гораздо большего, чем просто один случай
Flexo
1
Действительно, это только один небольшой вариант использования.
празеодим
Я думаю, что это определение веб-сервисов
Бахадир Тасдемир