Classes Wrapper en Java

Classes Wrapper en Java

1. Vue d'ensemble

Comme son nom l'indique,wrapper classes are objects encapsulating primitive Java types.

Chaque primitive Java a un wrapper correspondant:

  • booléen, octet, court, char, int, long, flottant, double

  • Boolean, Byte, Short, Character, Integer, Long, Float, Double

Ils sont tous définis dans le packagejava.lang, nous n’avons donc pas besoin de les importer manuellement.

2. Classes Wrapper

«À quoi sert une classe wrapper?». C'est l'un descommon Java interview questionsles plus.

Fondamentalement,generic classes only work with objects and don’t support primitives. En conséquence, si nous voulons travailler avec eux, nous devons convertir les valeurs primitives en objets wrapper.

Par exemple, Java Collection Framework fonctionne exclusivement avec des objets. Il y a longtemps (avant Java 5, il y a près de 15 ans), il n'y avait pas de boîte automatique et, par exemple, nous ne pouvions pas simplement appeleradd(5) sur une collection deIntegers.

A ce moment, cesprimitive values needed to be manually converted to corresponding wrapper classes et stockés dans des collections.

Aujourd'hui, avec l'autoboxing, nous pouvons facilement faireArrayList.add(101) mais en interne Java convertit la valeur primitive enInteger avant de la stocker dans leArrayList en utilisant la méthodevalueOf().

3. Conversion de classe primitive en classe wrapper

Maintenant, la grande question est la suivante: comment convertir une valeur primitive en classe d'encapsidation correspondante, par exemple. unint àInteger ou unchar àCharacter?

Eh bien,we can either use constructor or static factory methods to convert a primitive value to an object d'une classe wrapper.

Voyons un exemple de conversion d'une valeurint en objetInteger en Java:

Integer object = new Integer(1);

Integer anotherObject = Integer.valueOf(1);

La méthodevalueOf() renvoie une instance représentant la valeurint spécifiée.

Il retourne les valeurs en cache ce qui le rend efficace. Il met toujours en cache les valeurs comprises entre -128 et 127, mais peut également mettre en cache d'autres valeurs en dehors de cette plage.

De même, nous pouvons également convertirboolean enBoolean, byte enByte, char enCharacter, long enLong, float enFloat, etdouble enDouble. Cependant, si nous devonsconvert String to Integer, nous devons utiliser la méthodeparseInt() carString n'est pas une classe wrapper.

D'autre part,to convert from a wrapper object to a primitive value, we can use the corresponding method such as intValue(), doubleValue() etc:

int val = object.intValue();

Une référence complète peut être trouvéehere.

4. Autoboxing et Unboxing

Dans la section précédente, nous avons montré comment convertir manuellement une valeur primitive en objet.

Après Java 5,this conversion can be done automatically by using features called autoboxing and unboxing.

“Boxing” refers to converting a primitive value into a corresponding wrapper object. Parce que cela peut se produire automatiquement, c'est ce que l'on appelle la boîte automatique.

De même,when a wrapper object is unwrapped into a primitive value then this is known as unboxing.

Ce que cela signifie en pratique, c'est que nous pouvons passer une valeur primitive à une méthode qui attend un objet wrapper  ou assigner une primitive à une variable qui attend un objet:

List list = new ArrayList<>();
list.add(1); // autoboxing

Integer val = 2; // autoboxing

Dans cet exemple, Java convertira automatiquement la valeur primitiveint en wrapper.

En interne, il utilise la méthodevalueOf() pour faciliter la conversion. Par exemple, les lignes suivantes sont équivalentes:

Integer value = 3;

Integer value = Integer.valueOf(3);

Bien que cela facilite la conversion et facilite la lecture des codes, il existe certains cas oùwe shouldn’t use autoboxing e.g. inside a loop.

Semblable à l'autoboxing, le déballage est effectué automatiquement lors du passage d'un objet à une méthode qui attend une primitive ou lors de son affectation à une variable primitive:

Integer object = new Integer(1);
int val1 = getSquareValue(object); //unboxing
int val2 = object; //unboxing

public static int getSquareValue(int i) {
    return i*i;
}

Fondamentalement,if we write a method that accepts a primitive value or wrapper object, we can still pass both values to them. Java se chargera de passer le bon type, par ex. primitive ou wrapper selon le contexte.

5. Conclusion

Dans ce rapide tutoriel, nous avons parlé des classes wrapper en Java, ainsi que du mécanisme de la sélection automatique et de la décompression.