Che cos'è una classe wrapper?


Risposte:


171

In generale, una classe wrapper è qualsiasi classe che "avvolge" o "incapsula" la funzionalità di un'altra classe o componente. Questi sono utili fornendo un livello di astrazione dall'implementazione della classe o componente sottostante; ad esempio, le classi wrapper che avvolgono i componenti COM possono gestire il processo di richiamo del componente COM senza disturbare il codice chiamante con esso. Possono anche semplificare l'uso dell'oggetto sottostante riducendo il numero di punti dell'interfaccia coinvolti; frequentemente, ciò rende più sicuro l'uso dei componenti sottostanti.


15
Una classe wrapper (come adattatore) viene utilizzata quando il wrapper deve rispettare una particolare interfaccia e deve supportare un comportamento polimorfico. D'altra parte, una facciata viene utilizzata quando si desidera lavorare con un'interfaccia più semplice o più semplice.
Yadu,

3
In questo post, si propone che un wrapper potrebbe essere utile per la creazione di un proxy rigorosamente definiti per una classe tardo-bound: Posso utilizzare l'associazione tardiva ... . È un uso aggiuntivo valido per gli involucri oltre a quello sopra descritto da Paul Sonier?
Todd,

1
@NirajanSingh Wrapper riutilizza due interfacce già esistenti e fa funzionare l'una con l'altra. D'altra parte, la facciata crea una nuova interfaccia.
Alireza,

67

Proprio come sembra: una classe che "racchiude" la funzionalità di un'altra classe o API in un'API più semplice o semplicemente diversa.

Vedi: Modello adattatore , Modello facciata


Sì! Spesso sinonimo di modello di facciata. In molti documenti di codice vedo il metodo evidente della facciata, descritto come "metodo Wrapper to XX :: yy" o una piccola aggiunta come "metodo Wrapper to XX :: yy con gestione delle eccezioni".
Peter Krauss,

41

Le classi wrapper offrono un modo per utilizzare i tipi primitivi come oggetti. Per ogni primitiva, abbiamo una classe wrapper come,

int Integer
byte Byte 

Integer e Byte sono le classi wrapper di int e byte primitivi. Ci sono tempi / restrizioni in cui è necessario utilizzare le primitive come oggetti, quindi le classi wrapper forniscono un meccanismo chiamato boxing / unboxing.

Il concetto può essere ben compreso dal seguente esempio come

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

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

quindi è così che possiamo usare il tipo di classe wrapper per convertire anche in altri tipi primitivi. Questo tipo di conversione viene utilizzato quando è necessario convertire un tipo primitivo in oggetto e utilizzarli per ottenere anche altri primitivi. Tuttavia, per questo approccio, è necessario scrivere un codice grande. Tuttavia, lo stesso può essere ottenuto con la semplice tecnica di casting poiché lo snippet di codice può essere ottenuto come di seguito

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

Sebbene il doppio valore sia esplicitamente convertito in valore intero chiamato anche downcasting.


1
La tua risposta implica che le classi wrapper sono solo per oggetti primitivi.
Guillaume F.

17

Una classe wrapper non deve necessariamente avvolgere un'altra classe. Potrebbe essere una funzionalità di wrapping della classe API, ad esempio un file dll.

Ad esempio, potrebbe essere molto utile creare una classe wrapper dll, che si occupa di tutte le inizializzazioni e pulizie della dll e di creare metodi di classe che racchiudano i puntatori a funzioni creati da es GetProcAddress().

Saluti !


8

Una classe wrapper è una classe che "avvolge" qualcos'altro, proprio come il suo nome.

La definizione più formale di esso sarebbe una classe che implementa il modello di adattatore . Ciò consente di modificare un set di API in una forma più utilizzabile e leggibile. Ad esempio, in C #, se si desidera utilizzare l'API di Windows nativa, è utile includerla in una classe conforme alle linee guida di progettazione .NET.


2
Secondo la mia comprensione del modello di adattatore, è diverso da un wrapper: se X avvolge Y, allora X dovrebbe incapsulare lo stato di Y, ma non la sua identità . Dati due casi di X, entrambi i quali racchiudono un Y, non dovrebbe esserci alcun modo per dimostrare che entrambi i casi di X avvolgono la stessa istanza di Y. Al contrario, un oggetto adattatore incapsulerà spesso identità ma non stato; una modifica all'oggetto da adattare non sarebbe considerata una modifica all'adattatore stesso.
Supercat,


7

Potrebbe anche essere utile notare che in alcuni ambienti, gran parte di ciò che potrebbero fare le classi wrapper viene sostituito da aspetti.

MODIFICARE:

In generale un wrapper si espanderà su ciò che fa il wrapper, senza essere preoccupato per l'implementazione del wrapper, altrimenti non ha senso avvolgere o estendere la classe wrapped. Un esempio tipico è quello di aggiungere informazioni di temporizzazione o funzionalità di registrazione attorno ad altre interfacce di servizio, anziché aggiungerle ad ogni implementazione di tale interfaccia.

Questo finisce per essere un tipico esempio di programmazione Aspect. Piuttosto che passare attraverso una funzione di interfaccia per funzione e aggiungendo la registrazione del bollettino, nella programmazione dell'aspetto si definisce un punto di taglio, che è una sorta di espressione regolare per i metodi, e quindi si dichiarano i metodi che si desidera eseguire prima, dopo o intorno a tutti i metodi corrispondenti il punto. Probabilmente è giusto affermare che la programmazione degli aspetti è una sorta di uso del modello Decorator, per il quale possono essere usate anche le classi wrapper, ma che entrambe le tecnologie hanno altri usi.


7

La classe wrapper è una classe che avvolge un'altra classe e fornisce l'astrazione tra il client e la classe originale che viene spostata.


5

una classe wrapper è generalmente una classe che ha un oggetto come proprietà privata. il wrapper implementa l'API di quell'oggetto privato e quindi può essere passato come argomento in cui l'oggetto privato sarebbe.

supponiamo di avere una raccolta e di voler utilizzare una sorta di traduzione quando gli oggetti vengono aggiunti ad essa - si scrive una classe wrapper che ha tutti i metodi della raccolta. quando viene chiamato add (), il wrapper traduce gli argomenti invece di passarli nella raccolta privata.

il wrapper può essere usato ovunque una collezione possa essere usata e l'oggetto privato può avere ancora altri oggetti che si riferiscono ad esso e lo leggono.


1
D'accordo, il mio punto di vista personale sugli involucri è che sembrano e si sentono come il tipo originale e possono implementare la stessa interfaccia, mantenendo definitivamente lo stato dell'istanza di wrapping. Esistono come un modo per "intercettare" le chiamate ai membri.
Luke Puplett,

3

Una classe wrapper è una classe che viene utilizzata per racchiudere un'altra classe per aggiungere un livello di riferimento indiretto e astrazione tra il client e la classe originale da avvolgere.


3

La classe wrapper è un wrapper attorno a un tipo di dati primitivo. Rappresenta tipi di dati primitivi nelle rispettive istanze di classe corrispondenti, ad esempio un tipo di dati booleani può essere rappresentato come un'istanza di classe booleana. Tutte le classi wrapper primitive in Java sono immutabili, cioè una volta assegnato un valore a un'istanza della classe wrapper non può essere ulteriormente modificata.


3

La programmazione Java fornisce una classe wrapper per ogni tipo di dati primitivo, per convertire un tipo di dati primitivo in modo che corrisponda all'oggetto della classe wrapper.


1

Fare benessere in una classe wrapper non è un lavoro facile. Capire una classe wrapper come è progettata da altri non è un lavoro facile. Perché è un'idea, non codice. Solo quando capisci l'idea, puoi capire il wrapper.


0

Le classi wrapper sono nate per soddisfare un'esigenza di base dei programmatori, vale a dire utilizzare valori primitivi ovunque siano consentiti solo gli oggetti. Come suggerisce il nome, le classi wrapper avvolgono un valore primitivo e mantengono il valore in un oggetto. Quindi, tutti quei posti in cui le primitive non erano consentite - come generici, chiavi hashmap, arrailisti ecc. - adesso i programmatori hanno la possibilità di fornire questi valori primitivi come tipi di wrapper corrispondenti.

Inoltre, questi tipi di wrapper hanno una serie di metodi di utilità per la conversione dal tipo primitivo ai corrispondenti tipi di wrapper e viceversa, e anche dalle stringhe ai tipi di wrapper e viceversa.

Ho scritto un articolo dettagliato sulle classi wrapper in un mio blog che spiega in profondità il concetto di tipi di wrapper - http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (Disclosure - Questo blog è di mia proprietà)


0

Al momento ho usato una classe wrapper per il mio progetto e i principali vantaggi che ottengo (solo un vantaggio per ampliare la spiegazione dell'argomento):

Gestione delle eccezioni: la mia classe principale, che avvolge un'altra classe, ha metodi che generano eccezioni, se presenti, quindi ho creato una classe wrapper che gestisce le eccezioni e le registra immediatamente. Quindi, nel mio ambito principale, non esiste una gestione delle eccezioni. Chiamo solo un metodo e faccio qualcosa.

Facile utilizzo: posso avviare facilmente l'oggetto. La fase che inizia normalmente è composta da molti passaggi.

Leggibilità del codice: quando un altro programmatore apre il mio codice, il codice sembrerà molto chiaro e facile da manipolare.

Nascondere i dettagli: se stai generando una classe che verrà utilizzata da un altro programmatore, puoi racchiudere i dettagli come "gestione degli errori, gestione delle eccezioni, registrazione dei messaggi e così via" in modo che il programmatore non debba gestire il caos, semplicemente usa i metodi.


0

Una classe wrapper è una classe che ha il solo scopo di contenere qualcosa e aggiungere alcune funzionalità ad essa. In Java poiché le primitive (come ints, float, chars ...) non sono oggetti, quindi se vuoi trattarli come uno allora devi usare una classe wrapper. Supponiamo di voler creare un vettore di ints, il problema è che un vettore contiene solo oggetti non primitivi. Quindi quello che farai è mettere tutti gli integri in un wrapper Integer e usarlo. Esempio:

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();

Questo è noto come primitivi di boxe piuttosto che avvolgimento.
cyborg,

-8

un wrapper è una classe che viene utilizzata per comunicare tra due diverse applicazioni tra piattaforme diverse


Penso che puoi usarlo per molto più di un solo caso
Flexo

1
In effetti, questo è solo un piccolo caso d'uso.
praseodym,

Penso che questa sia la definizione dei servizi web
Bahadir Tasdemir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.