Was ist eine Wrapper-Klasse?

221

Was ist eine Wrapper-Klasse?
Wie sind solche Klassen nützlich?

Bhaskar
quelle

Antworten:

171

Im Allgemeinen ist eine Wrapper-Klasse eine Klasse, die die Funktionalität einer anderen Klasse oder Komponente "umschließt" oder "kapselt". Diese sind nützlich, indem eine Abstraktionsebene von der Implementierung der zugrunde liegenden Klasse oder Komponente bereitgestellt wird. Beispielsweise können Wrapper-Klassen, die COM-Komponenten umschließen, den Prozess des Aufrufs der COM-Komponente verwalten, ohne den aufrufenden Code damit zu belästigen. Sie können auch die Verwendung des zugrunde liegenden Objekts vereinfachen, indem sie die Anzahl der beteiligten Schnittstellenpunkte reduzieren. Dies führt häufig zu einer sichereren Verwendung der zugrunde liegenden Komponenten.

Paul Sonier
quelle
15
Eine Wrapper-Klasse (als Adapter) wird verwendet, wenn der Wrapper eine bestimmte Schnittstelle berücksichtigen und ein polymorphes Verhalten unterstützen muss. Andererseits wird eine Fassade verwendet, wenn eine einfachere oder einfachere Schnittstelle zum Arbeiten gewünscht wird.
Yadu
3
In diesem Beitrag wird vorgeschlagen , dass ein Wrapper für die Erstellung einen streng definierten Proxy für eine Late-gebundene Klasse nützlich sein könnte: Kann ich spät Bindung verwenden ... . Ist dies eine gültige zusätzliche Verwendung für Wrapper, die über das hinausgeht, was Paul Sonier oben beschrieben hat?
Todd
1
@NirajanSingh Wrapper verwendet zwei bereits vorhandene Schnittstellen wieder und lässt eine mit der anderen arbeiten. Auf der anderen Seite schafft die Fassade eine neue Schnittstelle.
Alireza
67

Genau so, wie es sich anhört: Eine Klasse, die die Funktionalität einer anderen Klasse oder API in eine einfachere oder lediglich andere API "einschließt".

Siehe: Adaptermuster , Fassadenmuster

Shog9
quelle
Ja! Häufig ein Synonym für Fassadenmuster. In vielen Codedokumentationen sehe ich eine offensichtliche Facade-Methode, die als "Wrapper to XX :: yy-Methode" oder eine kleine Adiction wie "Wrapper to XX :: yy-Methode mit Ausnahmebehandlung" beschrieben wird.
Peter Krauss
41

Wrapper-Klassen bieten eine Möglichkeit, primitive Typen als Objekte zu verwenden. Für jedes Grundelement haben wir eine Wrapper-Klasse wie:

int Integer
byte Byte 

Integer und Byte sind die Wrapper-Klassen von primitivem int und Byte. Es gibt Zeiten / Einschränkungen, in denen Sie die Grundelemente als Objekte verwenden müssen, sodass Wrapper-Klassen einen Mechanismus bereitstellen, der als Boxing / Unboxing bezeichnet wird.

Das Konzept kann durch das folgende Beispiel als gut verstanden werden

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

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

Auf diese Weise können wir den Wrapper-Klassentyp verwenden, um ihn auch in andere primitive Typen zu konvertieren. Diese Art der Konvertierung wird verwendet, wenn Sie einen primitiven Typ in ein Objekt konvertieren und damit auch andere primitive Elemente abrufen müssen. Für diesen Ansatz müssen Sie jedoch einen großen Code schreiben. Dasselbe kann jedoch mit der einfachen Casting-Technik erreicht werden, da das Code-Snippet wie folgt erreicht werden kann

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

Obwohl der doppelte Wert explizit in einen ganzzahligen Wert konvertiert wird, der auch als Downcasting bezeichnet wird.

SBTec
quelle
1
Ihre Antwort impliziert, dass Wrapper-Klassen nur für primitive Objekte gelten.
Guillaume F.
17

Eine Wrapper-Klasse muss nicht unbedingt eine andere Klasse umbrechen. Es kann sich um eine API-Klassenumbruchfunktion in einer DLL-Datei handeln.

Zum Beispiel kann es sehr nützlich sein, eine DLL-Wrapper-Klasse zu erstellen, die sich um die gesamte Initialisierung und Bereinigung der DLL kümmert und Klassenmethoden erstellt, die Funktionszeiger umschließen, die z GetProcAddress().

Prost !

ralphtheninja
quelle
8

Eine Wrapper-Klasse ist eine Klasse, die genau wie ihren Namen etwas anderes "umschließt".

Die formalere Definition wäre eine Klasse, die das Adaptermuster implementiert . Auf diese Weise können Sie einen Satz von APIs in eine besser verwendbare, lesbare Form ändern. Wenn Sie beispielsweise in C # die native Windows-API verwenden möchten, ist es hilfreich, sie in eine Klasse zu packen, die den .NET-Entwurfsrichtlinien entspricht.

Reed Copsey
quelle
2
Nach meinem Verständnis des Adaptermusters unterscheidet es sich von einem Wrapper: Wenn X Y umschließt, sollte X den Status von Y einkapseln , nicht jedoch seine Identität . Bei zwei Instanzen von X, die beide ein Y umschließen , sollte es keine Möglichkeit geben, zu beweisen, dass beide Instanzen von X dieselbe Instanz von Y umschließen. Im Gegensatz dazu kapselt ein Adapterobjekt häufig Identität, aber keinen Zustand. Eine Änderung des zu adaptierenden Objekts wird nicht als Änderung des Adapters selbst angesehen.
Supercat
7

Es kann auch hilfreich sein zu beachten, dass in einigen Umgebungen vieles, was Wrapper-Klassen tun könnten, durch Aspekte ersetzt wird.

BEARBEITEN:

Im Allgemeinen wird ein Wrapper die Funktionsweise des Wrappees erweitern, ohne sich Gedanken über die Implementierung des Wrappees machen zu müssen. Andernfalls macht es keinen Sinn, den Wrapper zu verpacken oder die umhüllte Klasse zu erweitern. Ein typisches Beispiel ist das Hinzufügen von Zeitinformationen oder Protokollierungsfunktionen um eine andere Dienstschnittstelle herum, anstatt sie jeder Implementierung dieser Schnittstelle hinzuzufügen.

Dies ist dann ein typisches Beispiel für die Aspektprogrammierung. Anstatt eine Schnittstellenfunktion Funktion für Funktion durchzugehen und die Boilerplate-Protokollierung hinzuzufügen, definieren Sie in der Aspektprogrammierung einen Pointcut, der eine Art regulärer Ausdruck für Methoden ist, und deklarieren dann Methoden, die vor, nach oder um alle übereinstimmenden Methoden ausgeführt werden sollen der pointcut. Es ist wahrscheinlich fair zu sagen, dass die Aspektprogrammierung eine Art Verwendung des Decorator-Musters ist, für das auch Wrapper-Klassen verwendet werden können, aber dass beide Technologien andere Verwendungszwecke haben.

Jherico
quelle
7

Die Wrapper-Klasse ist eine Klasse, die die andere Klasse umschließt und die Abstraktion zwischen dem Client und der ursprünglichen Klasse bereitstellt, die umbrochen wird.

Rakesh Verma
quelle
5

Eine Wrapper-Klasse ist normalerweise eine Klasse, die ein Objekt als Privateigenschaft hat. Der Wrapper implementiert die API dieses privaten Objekts und kann daher als Argument übergeben werden, wo das private Objekt dies tun würde.

Angenommen, Sie haben eine Sammlung und möchten eine Art Übersetzung verwenden, wenn Objekte hinzugefügt werden. Sie schreiben eine Wrapper-Klasse, die alle Methoden der Sammlung enthält. Wenn add () aufgerufen wird, übersetzt der Wrapper die Argumente, anstatt sie nur an die private Sammlung zu übergeben.

Der Wrapper kann überall dort verwendet werden, wo eine Sammlung verwendet werden kann, und das private Objekt kann weiterhin andere Objekte enthalten, die darauf verweisen und es lesen.

Amir Arad
quelle
1
Ich stimme zu, meine persönliche Meinung zu Wrappern ist, dass sie wie der ursprüngliche Typ aussehen und sich anfühlen und möglicherweise dieselbe Schnittstelle implementieren, wobei der Status der umschlossenen Instanz definitiv beibehalten wird. Sie dienen dazu, Anrufe an Mitglieder abzufangen.
Luke Puplett
3

Eine Wrapper-Klasse ist eine Klasse, die zum Umschließen einer anderen Klasse verwendet wird, um eine Ebene der Indirektion und Abstraktion zwischen dem Client und der ursprünglichen Klasse, die umbrochen wird, hinzuzufügen.

Andrew Hare
quelle
3

Die Wrapper-Klasse ist ein Wrapper um einen primitiven Datentyp. Es repräsentiert primitive Datentypen in ihren entsprechenden Klasseninstanzen, z. B. kann ein boolescher Datentyp als boolesche Klasseninstanz dargestellt werden. Alle primitiven Wrapper-Klassen in Java sind unveränderlich, dh sobald einer Wrapper-Klasseninstanz ein Wert zugewiesen wurde, kann er nicht weiter geändert werden.

David
quelle
3

Die Java-Programmierung bietet eine Wrapper-Klasse für jeden primitiven Datentyp, um einen primitiven Datentyp in ein entsprechendes Objekt der Wrapper-Klasse zu konvertieren.

DIESE PASHA
quelle
1

Es ist keine leichte Aufgabe, eine Wrapper-Klasse zum Wohlbefinden zu bringen. Es ist auch keine leichte Aufgabe, eine Wrapper-Klasse zu verstehen, wie sie von einigen anderen entworfen wurde. Weil es eine Idee ist, kein Code. Nur wenn Sie die Idee verstehen, können Sie Wrapper verstehen.

Tony
quelle
0

Wrapper-Klassen wurden ins Leben gerufen, um ein Grundbedürfnis von Programmierern zu erfüllen - dh um primitive Werte zu verwenden, wo nur Objekte erlaubt sind. Wie der Name schon sagt, umschließen Wrapper-Klassen einen primitiven Wert und halten den Wert in einem Objekt. Alle Orte, an denen Grundelemente nicht zulässig waren, wie Generika, Hashmap-Schlüssel, Arraylisten usw., haben Programmierer nun die Möglichkeit, diese Grundelemente als entsprechende Wrapper-Typen anzugeben.

Darüber hinaus verfügen diese Wrapper-Typen über eine Reihe von Dienstprogrammmethoden zum Konvertieren von primitiven Typen in entsprechende Wrapper-Typen und zurück sowie von Strings zu Wrapper-Typen und zurück.

Ich habe in meinem Blog einen ausführlichen Artikel über Wrapper-Klassen geschrieben, in dem das Konzept der Wrapper-Typen ausführlich erläutert wird - http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (Disclosure - Dieser Blog gehört mir)

Dhruv Rai Puri
quelle
0

Ich habe derzeit eine Wrapper-Klasse für mein Projekt und die wichtigsten Vorteile verwendet (nur ein einziger Vorteil, um die Themenerklärung zu erweitern):

Ausnahmebehandlung: Meine Hauptklasse, die von einer anderen Klasse umbrochen wird, verfügt über Methoden, die Ausnahmen auslösen, falls diese auftreten. Daher habe ich eine Wrapper-Klasse erstellt, die die Ausnahmen behandelt und sie sofort protokolliert. In meinem Hauptbereich gibt es also keine Ausnahmebehandlung. Ich rufe einfach eine Methode auf und mache etwas.

Einfache Verwendung: Ich kann das Objekt einfach initiieren. Normalerweise besteht die Startphase aus vielen Schritten.

Lesbarkeit des Codes: Wenn ein anderer Programmierer meinen Code öffnet, erscheint der Code sehr klar und leicht zu manipulieren.

Ausblenden der Details: Wenn Sie eine Klasse generieren, die ein anderer Programmierer verwenden wird, können Sie die Details wie "Fehlerbehandlung, Ausnahmebehandlung, Protokollierung von Nachrichten usw." umbrechen, damit der Programmierer sie nicht verarbeiten muss Das Chaos nutzt einfach die Methoden.

Bahadir Tasdemir
quelle
0

Eine Wrapper-Klasse ist eine Klasse, die ausschließlich dazu dient, etwas zu halten und einige Funktionen hinzuzufügen. In Java sind die Grundelemente (wie Ints, Floats, Chars ...) keine Objekte. Wenn Sie sie also wie eines behandeln möchten, müssen Sie eine Wrapper-Klasse verwenden. Angenommen, Sie möchten einen Vektor mit Ints erstellen. Das Problem ist, dass ein Vektor nur Objekte und keine Grundelemente enthält. Sie werden also alle Ints in einen Integer-Wrapper einfügen und diesen verwenden. Beispiel:

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
quelle
Dies wird eher als Boxprimitive als als Wrapping bezeichnet.
Cyborg
-8

Ein Wrapper ist eine Klasse, die zur Kommunikation zwischen zwei verschiedenen Anwendungen zwischen verschiedenen Plattformen verwendet wird

laxminarayan
quelle
Ich denke, Sie können es für viel mehr als nur diesen einen Fall verwenden
Flexo
1
Dies ist in der Tat nur ein kleiner Anwendungsfall.
Praseodym
Ich denke, dies ist die Definition der Webdienste
Bahadir Tasdemir