¿Qué es una clase de envoltura?


Respuestas:


171

En general, una clase contenedora es cualquier clase que "envuelve" o "encapsula" la funcionalidad de otra clase o componente. Estos son útiles al proporcionar un nivel de abstracción de la implementación de la clase o componente subyacente; por ejemplo, las clases de envoltura que envuelven componentes COM pueden administrar el proceso de invocar el componente COM sin molestar el código de llamada. También pueden simplificar el uso del objeto subyacente al reducir el número de puntos de interfaz involucrados; Con frecuencia, esto permite un uso más seguro de los componentes subyacentes.


15
Se utiliza una clase de contenedor (como adaptador) cuando el contenedor debe respetar una interfaz particular y debe admitir un comportamiento polimórfico. Por otro lado, una fachada se usa cuando se quiere una interfaz más fácil o más simple para trabajar.
Yadu

3
En esta publicación, se propone que un contenedor podría ser útil para crear un proxy estrictamente definido para una clase de enlace tardío : ¿Puedo usar el enlace tardío ... ? ¿Es este un uso adicional válido para envoltorios más allá de lo que Paul Sonier describió anteriormente?
Todd

1
@NirajanSingh Wrapper reutiliza dos interfaces ya existentes y hace que una funcione con la otra. Por otro lado, la fachada crea una nueva interfaz.
Alireza

67

Justo como suena: una clase que "envuelve" la funcionalidad de otra clase o API en una API más simple o simplemente diferente.

Ver: patrón de adaptador , patrón de fachada


¡Si! Con frecuencia un sinónimo de patrón de fachada. En muchos documentos de código veo un método de Fachada evidente, descrito como "Método Wrapper to XX :: yy" o una pequeña adicción como "Método Wrapper to XX :: yy con manejo de excepciones".
Peter Krauss

41

Las clases de envoltura proporcionan una forma de usar tipos primitivos como objetos. Para cada primitiva, tenemos una clase de contenedor como,

int Integer
byte Byte 

Integer y Byte son las clases de contenedor de primitivo int y byte. Hay tiempos / restricciones cuando necesita usar las primitivas como objetos, por lo que las clases de contenedor proporcionan un mecanismo llamado boxing / unboxing.

El siguiente ejemplo puede entender bien el concepto como

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

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

así es como podemos usar el tipo de clase wrapper para convertir también a otros tipos primitivos. Este tipo de conversión se usa cuando necesita convertir un tipo primitivo en objeto y usarlos para obtener otras primitivas también. Aunque para este enfoque, necesita escribir un código grande. Sin embargo, se puede lograr lo mismo con la técnica de conversión simple, ya que el fragmento de código se puede lograr de la siguiente manera

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

Aunque el valor doble se convierte explícitamente en un valor entero también llamado como downcasting.


1
Su respuesta implica que las clases de envoltura son solo para objetos primitivos.
Guillaume F.

17

Una clase contenedora no necesariamente necesita ajustar otra clase. Podría ser una funcionalidad de ajuste de clase de API en, por ejemplo, un archivo dll.

Por ejemplo, podría ser muy útil crear una clase dll wrapper, que se encarga de toda la inicialización y limpieza de dll y crear métodos de clase que envuelvan punteros de función creados a partir de, por ejemplo GetProcAddress().

Salud !


8

Una clase de contenedor es una clase que "se ajusta" a otra cosa, como su nombre.

La definición más formal de la misma sería una clase que implementa el Patrón Adaptador . Esto le permite modificar un conjunto de API en una forma más utilizable y legible. Por ejemplo, en C #, si desea utilizar la API nativa de Windows, es útil incluirla en una clase que cumpla con las pautas de diseño de .NET.


2
Según tengo entendido el patrón del adaptador, es diferente de un contenedor: si X envuelve Y, entonces X debería encapsular el estado de Y, pero no su identidad . Dadas dos instancias de X, las cuales envuelven una Y, no debería haber medios para demostrar que ambas instancias de X envuelven la misma instancia de Y. Por el contrario, un objeto adaptador a menudo encapsulará la identidad pero no el estado; un cambio en el objeto que se está adaptando no se consideraría un cambio en el adaptador en sí.
supercat


7

También podría ser valioso tener en cuenta que en algunos entornos, gran parte de lo que podrían hacer las clases de contenedor es ser reemplazado por aspectos.

EDITAR:

En general, una envoltura se expandirá sobre lo que hace la envoltura, sin preocuparse por la implementación de la envoltura, de lo contrario no hay ningún punto de envoltura versus extender la clase envuelta. Un ejemplo típico es agregar información de temporización o funcionalidad de registro en alguna otra interfaz de servicio, en lugar de agregarla a cada implementación de esa interfaz.

Esto termina siendo un ejemplo típico para la programación de Aspect. En lugar de pasar por una interfaz función por función y agregar el registro repetitivo, en la programación de aspectos, define un punto de corte, que es una especie de expresión regular para los métodos, y luego declara los métodos que desea ejecutar antes, después o alrededor de todos los métodos coincidentes El punto de corte. Probablemente sea justo decir que la programación de aspectos es un tipo de uso del patrón Decorator, para el que también se pueden usar las clases wrapper, pero que ambas tecnologías tienen otros usos.


7

La clase Wrapper es una clase que ajusta la otra clase y proporciona la abstracción entre el cliente y la clase original que se está envolviendo.


5

Una clase contenedora suele ser una clase que tiene un objeto como propiedad privada. el contenedor implementa la API de ese objeto privado y, por lo tanto, se puede pasar como un argumento donde lo haría el objeto privado.

supongamos que tiene una colección y desea utilizar algún tipo de traducción cuando se le agregan objetos: escribe una clase de contenedor que tiene todos los métodos de la colección. cuando se llama a add (), el contenedor traduce los argumentos en lugar de simplemente pasarlos a la colección privada.

el contenedor se puede usar en cualquier lugar donde se pueda usar una colección, y el objeto privado aún puede tener otros objetos que se refieran a él y lo lean.


1
De acuerdo, mi opinión personal sobre los contenedores es que se ven y se sienten como el tipo original y pueden implementar la misma interfaz, sin duda mantienen el estado de la instancia envuelta. Existen como una forma de "interceptar" las llamadas a los miembros.
Luke Puplett el

3

Una clase contenedora es una clase que se utiliza para ajustar otra clase para agregar una capa de indirección y abstracción entre el cliente y la clase original que se está ajustando.


3

La clase de contenedor es un contenedor alrededor de un tipo de datos primitivo. Representa los tipos de datos primitivos en sus instancias de clase correspondientes, por ejemplo, un tipo de datos booleanos se puede representar como una instancia de clase booleana. Todas las clases de contenedor primitivas en Java son inmutables, es decir, una vez asignado un valor a una instancia de clase de contenedor no se puede cambiar más.


3

La programación Java proporciona una clase de contenedor para cada tipo de datos primitivos, para convertir un tipo de datos primitivos para que se corresponda con el objeto de la clase de contenedor.


1

Hacer una clase de envoltura de bienestar no es un trabajo fácil. Comprender una clase de contenedor como está diseñado por otros tampoco es un trabajo fácil. Porque es idea, no código. Solo cuando entiendes la idea, puedes entender el envoltorio.


0

Las clases de envoltura surgieron para satisfacer una necesidad básica de los programadores, es decir, usar valores primitivos donde solo se permiten objetos. Como su nombre sugiere, las clases de envoltura se ajustan a un valor primitivo y mantienen el valor en un objeto. Por lo tanto, todos aquellos lugares donde no se permitían las primitivas, como genéricos, hashmap-keys, Arraylists, etc., los programadores ahora tienen la opción de proporcionar estos valores primitivos como sus tipos de contenedor correspondientes.

Además, estos tipos de contenedor tienen varios métodos de utilidad para convertir de tipo primitivo a tipos de contenedor y viceversa correspondientes, y también de cadenas a tipos de contenedor y viceversa.

Escribí un artículo detallado sobre clases de envoltura en mi blog que explica en profundidad el concepto de tipos de envoltura: http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (Divulgación: Este blog es de mi propiedad)


0

Actualmente utilicé una clase de contenedor para mi proyecto y los principales beneficios que obtengo (solo un beneficio único para ampliar la explicación del tema):

Manejo de excepciones: mi clase principal, que envuelve otra clase, tiene métodos que arrojan excepciones si ocurre alguna, así que creé una clase de contenedor que maneja las excepciones y las registra inmediatamente. Entonces, en mi ámbito principal, no hay manejo de excepciones. Solo llamo un método y hago algo.

Uso fácil: puedo iniciar fácilmente el objeto. Normalmente, la fase de inicio se compone de muchos pasos.

Legibilidad del código: cuando otro programador abre mi código, el código parecerá muy claro y fácil de manipular.

Ocultar los detalles: si está generando una clase que otro programador va a utilizar, puede ajustar los detalles como "manejo de errores, manejo de excepciones, mensajes de registro y etc." para que el programador no tenga que manejar el caos, simplemente usa los métodos.


0

Una clase contenedora es una clase que tiene el único propósito de mantener algo y agregarle alguna funcionalidad. En Java, dado que las primitivas (como ints, floats, chars ...) no son objetos, por lo que si desea tratarlos como uno, debe usar una clase wrapper. Supongamos que desea crear un Vector de entradas, el problema es que un Vector solo contiene Objetos, no primitivos. Entonces, lo que harás es poner todas las entradas en un contenedor entero y usarlas. Ejemplo:

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

Esto se conoce como primitivas de boxeo en lugar de envoltura.
cyborg

-8

un contenedor es una clase que se usa para comunicarse entre dos aplicaciones diferentes entre plataformas diferentes


Creo que puede usarlo para mucho más que ese caso
Flexo

1
De hecho, este es solo un pequeño caso de uso.
praseodym

Creo que esta es la definición de los servicios web
Bahadir Tasdemir
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.