Qu'est-ce qu'une classe wrapper?

221

Qu'est-ce qu'une classe wrapper?
Comment ces classes sont-elles utiles?

Bhaskar
la source

Réponses:

171

En général, une classe wrapper est une classe qui "enveloppe" ou "encapsule" les fonctionnalités d'une autre classe ou d'un autre composant. Ceux-ci sont utiles en fournissant un niveau d'abstraction à partir de l'implémentation de la classe ou du composant sous-jacent; par exemple, les classes wrapper qui enveloppent les composants COM peuvent gérer le processus d'appel du composant COM sans déranger le code appelant avec lui. Ils peuvent également simplifier l'utilisation de l'objet sous-jacent en réduisant le nombre de points d'interface impliqués; fréquemment, cela permet une utilisation plus sûre des composants sous-jacents.

Paul Sonier
la source
15
Une classe wrapper (en tant qu'adaptateur) est utilisée lorsque le wrapper doit respecter une interface particulière et doit prendre en charge un comportement polymorphe. En revanche, une façade est utilisée lorsque l'on veut travailler avec une interface plus simple ou plus simple.
Yadu
3
Dans ce post, il est proposé qu'un emballage pourrait être utile pour créer un proxy strictement défini pour une classe liaison tardive: Puis - je utiliser la liaison tardive ... . Est-ce une utilisation supplémentaire valide pour les wrappers au-delà de ce que Paul Sonier a décrit ci-dessus?
Todd
1
@NirajanSingh Wrapper réutilise deux interfaces déjà existantes et fait fonctionner l'une avec l'autre. D'un autre côté, la façade crée une nouvelle interface.
Alireza
67

Exactement ce que cela ressemble: une classe qui "encapsule" les fonctionnalités d'une autre classe ou API dans une API plus simple ou simplement différente.

Voir: modèle d'adaptateur , modèle de façade

Shog9
la source
Oui! Souvent synonyme de motif de façade. Dans la documentation de nombreux codes, je vois la méthode évidente de Facade, décrite comme "la méthode Wrapper à XX :: yy" ou une petite addiction comme "la méthode Wrapper à XX :: yy avec gestion des exceptions".
Peter Krauss
41

Les classes wrapper fournissent un moyen d'utiliser des types primitifs comme objets. Pour chaque primitive, nous avons une classe wrapper telle que,

int Integer
byte Byte 

Integer et Byte sont les classes wrapper de primitive int et byte. Il y a des temps / restrictions lorsque vous devez utiliser les primitives comme objets, donc les classes wrapper fournissent un mécanisme appelé boxing / unboxing.

Le concept peut être bien compris par l'exemple suivant:

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

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

c'est ainsi que nous pouvons utiliser le type de classe wrapper pour convertir également en d'autres types primitifs. Ce type de conversion est utilisé lorsque vous devez convertir un type primitif en objet et les utiliser pour obtenir d'autres primitives également. Pour cette approche, vous devez écrire un gros code. Cependant, la même chose peut être obtenue avec la technique de conversion simple car l'extrait de code peut être obtenu comme ci-dessous

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

Bien que la valeur double soit explicitement convertie en valeur entière également appelée downcasting.

SBTec
la source
1
Votre réponse implique que les classes wrapper ne concernent que les objets primitifs.
Guillaume F.
17

Une classe wrapper n'a pas nécessairement besoin d'envelopper une autre classe. Il peut s'agir d'une fonctionnalité d'encapsulation de classe API, par exemple dans un fichier dll.

Par exemple, il peut être très utile de créer une classe wrapper dll, qui prend en charge toutes les initialisations et nettoyages dll et crée des méthodes de classe qui encapsulent les pointeurs de fonction créés à partir, par exemple GetProcAddress().

À votre santé !

ralphtheninja
la source
8

Une classe wrapper est une classe qui "enveloppe" quelque chose d'autre, tout comme son nom.

La définition la plus formelle serait une classe qui implémente le modèle d'adaptateur . Cela vous permet de modifier un ensemble d'API en une forme plus utilisable et lisible. Par exemple, en C #, si vous souhaitez utiliser l'API Windows native, cela aide à l'encapsuler dans une classe conforme aux directives de conception .NET.

Reed Copsey
la source
2
D'après ma compréhension du modèle d'adaptateur, il est différent d'un wrapper: si X encapsule Y, alors X devrait encapsuler l' état de Y, mais pas son identité . Étant donné deux instances de X, qui enveloppent toutes les deux un Y, il ne devrait y avoir aucun moyen de prouver que les deux instances de X enveloppent la même instance de Y. En revanche, un objet adaptateur encapsule souvent l'identité mais pas l'état; une modification de l'objet en cours d'adaptation ne serait pas considérée comme une modification de l'adaptateur lui-même.
supercat
7

Il peut également être utile de noter que dans certains environnements, une grande partie de ce que les classes wrapper peuvent faire est remplacée par des aspects.

ÉDITER:

En général, un wrapper va développer ce que fait le wrappee, sans se soucier de l'implémentation du wrappee, sinon il n'y a aucun intérêt à envelopper par rapport à l'extension de la classe wrappée. Un exemple typique consiste à ajouter des informations de synchronisation ou une fonctionnalité de journalisation autour d'une autre interface de service, au lieu de les ajouter à chaque implémentation de cette interface.

Cela finit par être un exemple typique de programmation Aspect. Plutôt que de passer par une interface fonction par fonction et d'ajouter une journalisation passe-partout, dans la programmation d'aspect, vous définissez un pointcut, qui est une sorte d'expression régulière pour les méthodes, puis déclarez les méthodes que vous souhaitez exécuter avant, après ou autour de toutes les méthodes correspondant le pointcut. Il est probablement juste de dire que la programmation d'aspect est une sorte d'utilisation du modèle Decorator, pour lequel les classes wrapper peuvent également être utilisées, mais que les deux technologies ont d'autres utilisations.

Jherico
la source
7

La classe wrapper est une classe qui encapsule l'autre classe et fournit l'abstraction entre le client et la classe d'origine en cours de wrappage.

Rakesh verma
la source
5

une classe wrapper est généralement une classe qui a un objet comme propriété privée. l'encapsuleur implémente l'API de cet objet privé et il peut donc être passé comme argument là où l'objet privé le ferait.

disons que vous avez une collection et que vous souhaitez utiliser une sorte de traduction lorsque des objets y sont ajoutés - vous écrivez une classe wrapper qui a toutes les méthodes de la collection. lorsque add () est appelé, le wrapper traduit les arguments au lieu de simplement les passer dans la collection privée.

l'encapsuleur peut être utilisé n'importe où une collection peut être utilisée, et l'objet privé peut toujours avoir d'autres objets s'y référant et le lisant.

Amir Arad
la source
1
D'accord, mon point de vue personnel sur les wrappers est qu'ils ressemblent et se sentent au type d'origine et peuvent implémenter la même interface, détenant définitivement l'état de l'instance enveloppée. Ils existent comme un moyen "d'intercepter" les appels aux membres.
Luke Puplett du
3

Une classe wrapper est une classe qui est utilisée pour envelopper une autre classe pour ajouter une couche d'indirection et d'abstraction entre le client et la classe d'origine qui est enveloppée.

Andrew Hare
la source
3

La classe wrapper est un wrapper autour d'un type de données primitif. Il représente les types de données primitifs dans leurs instances de classe correspondantes, par exemple un type de données booléen peut être représenté comme une instance de classe booléenne. Toutes les classes d'encapsuleurs primitives en Java sont immuables, c'est-à-dire qu'une fois qu'une valeur a été attribuée à une instance de classe d'encapsuleur ne peut plus être modifiée.

David
la source
3

La programmation Java fournit une classe wrapper pour chaque type de données primitif, pour convertir un type de données primitif en objet correspondant de la classe wrapper.

THOSEEF PASHA
la source
1

Faire du bien-être en classe wrapper n'est pas une tâche facile. Comprendre une classe wrapper comment elle est conçue par d'autres n'est pas non plus une tâche facile. Parce que c'est une idée, pas un code. Ce n'est que lorsque vous comprenez l'idée que vous pouvez comprendre le wrapper.

Tony
la source
0

Les classes Wrapper ont vu le jour pour répondre à un besoin fondamental des programmeurs - c'est-à-dire utiliser des valeurs primitives partout où seuls les objets sont autorisés. Comme leur nom l'indique, les classes wrapper entourent une valeur primitive et maintiennent la valeur dans un objet. Ainsi, tous les endroits où les primitives n'étaient pas autorisées - tels que les génériques, les clés de hachage, les tableaux, etc. - les programmeurs ont maintenant la possibilité de fournir ces valeurs primitives comme types d'encapsuleurs correspondants.

De plus, ces types d'encapsuleurs ont un certain nombre de méthodes utilitaires pour la conversion du type primitif en types d'encapsulage correspondants et inversement, ainsi que de chaînes en types d'encapsulage et inversement.

J'ai écrit un article détaillé sur les classes de wrapper dans un blog qui explique le concept des types de wrapper en profondeur - http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (Divulgation - Ce blog m'appartient)

Dhruv Rai Puri
la source
0

J'ai actuellement utilisé une classe wrapper pour mon projet et les principaux avantages que j'obtiens (juste un seul avantage pour élargir l'explication du sujet):

Gestion des exceptions: Ma classe principale, qui encapsule une autre classe, a des méthodes qui génèrent des exceptions si cela se produit, j'ai donc créé une classe wrapper qui gère les exceptions et les enregistre immédiatement. Donc, dans ma portée principale, il n'y a pas de gestion des exceptions. J'appelle juste une méthode et je fais quelque chose.

Utilisation facile: je peux facilement lancer l'objet. Normalement, la phase de lancement est composée de nombreuses étapes.

Lisibilité du code: Lorsqu'un autre programmeur ouvre mon code, le code semble très clair et facile à manipuler.

Masquer les détails: si vous générez une classe qu'un autre programmeur va utiliser, vous pouvez envelopper les détails comme "gestion des erreurs, gestion des exceptions, messages de journalisation et etc ..." afin que le programmeur n'ait pas à gérer le chaos, utilise simplement les méthodes.

Bahadir Tasdemir
la source
0

Une classe wrapper est une classe qui sert le seul but de contenir quelque chose et d'y ajouter des fonctionnalités. En Java, car les primitives (comme les entiers, les flottants, les caractères ...) ne sont pas des objets, donc si vous voulez les traiter comme tel, vous devez utiliser une classe wrapper. Supposons que vous souhaitiez créer un vecteur d'entiers, le problème est qu'un vecteur ne contient que des objets et non des primitives. Donc, ce que vous ferez, c'est de mettre toutes les entrées dans un wrapper Integer et de l'utiliser. Exemple:

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();
Reza Baradaran Gazorisangi
la source
Ceci est connu sous le nom de primitives de boxe plutôt que d'emballage.
cyborg
-8

un wrapper est une classe qui est utilisée pour communiquer entre deux applications différentes entre des plates-formes différentes

laxminarayan
la source
Je pense que vous pouvez l'utiliser pour bien plus qu'un cas
Flexo
1
En effet, ce n'est qu'un petit cas d'utilisation.
praseodym
Je pense que c'est la définition des services Web
Bahadir Tasdemir