Classes Wrapper en Java

1. Vue d'ensemble

Comme son nom l'indique, les classes wrapper sont des objets encapsulant des types Java primitifs.

Chaque primitive Java a un wrapper correspondant:

  • booléen, octet, court, char, int, long, flottant, double
  • Boolean, Byte, Short, Character, Integer, Long, Float, Double

Ceux-ci sont tous définis dans le package java.lang , nous n'avons donc pas besoin de les importer manuellement.

2. Classes de wrapper

«Quel est le but d'une classe wrapper?». C'est l'une des questions d'entretien Java les plus courantes.

Fondamentalement, les classes génériques ne fonctionnent qu'avec des objets et ne prennent pas en charge les 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 appeler add (5) sur une collection d' entiers.

À ce moment-là, ces valeurs primitives devaient être converties manuellement en classes wrapper correspondantes et stockées dans des collections.

Aujourd'hui, avec l'autoboxing, nous pouvons facilement faire ArrayList.add (101) mais en interne Java convertit la valeur primitive en Integer avant de la stocker dans ArrayList en utilisant la méthode valueOf () .

3. Conversion de classe primitive en classe wrapper

Maintenant, la grande question est: comment convertir une valeur primitive en une classe wrapper correspondante, par exemple un int en Integer ou un char en Character?

Eh bien, nous pouvons utiliser des méthodes de constructeur ou de fabrique statique pour convertir une valeur primitive en objet d'une classe wrapper.

Cependant, à partir de Java 9, les constructeurs de nombreuses primitives encadrées telles que Integer ou Long sont obsolètes.

Il est donc fortement recommandé de n'utiliser que les méthodes d'usine sur le nouveau code .

Voyons un exemple de conversion d'une valeur int en un objet Integer en Java:

Integer object = new Integer(1); Integer anotherObject = Integer.valueOf(1);

La méthode valueOf () renvoie une instance représentant la valeur int spécifiée .

Il renvoie les valeurs mises 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 convertir boolean en booléen, octet en octet, char en caractère, long en long, float en float et doubler en double. Cependant, si nous devons convertir String en Integer, nous devons utiliser la méthode parseInt () car String n'est pas une classe wrapper.

D'autre part, pour convertir un objet wrapper en une valeur primitive, nous pouvons utiliser la méthode correspondante telle que intValue (), doubleValue () etc:

int val = object.intValue(); 

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

4. Autoboxing et déballage

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

Après Java 5, cette conversion peut être effectuée automatiquement en utilisant des fonctionnalités appelées autoboxing et unboxing.

«Boxing» fait référence à la conversion d'une valeur primitive en un objet wrapper correspondant. Parce que cela peut se produire automatiquement, c'est ce qu'on appelle la boîte automatique.

De même, lorsqu'un objet wrapper est déballé en une valeur primitive, cela s'appelle unboxing.

Ce que cela signifie en pratique, c'est que nous pouvons passer une valeur primitive à une méthode qui attend un objet wrapperou assignez 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 primitive int en wrapper.

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

Integer value = 3; Integer value = Integer.valueOf(3);

Bien que cela rende la conversion plus facile et les codes plus lisibles, il y a des cas où nous ne devrions pas utiliser l'autoboxing, par exemple dans une boucle .

Semblable à l'autoboxing, le déballage se fait 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, si nous écrivons une méthode qui accepte une valeur primitive ou un objet wrapper, nous pouvons toujours leur transmettre les deux valeurs. Java se chargera de passer le bon type, par exemple primitive ou wrapper selon le contexte.

5. Conclusion

Dans ce rapide didacticiel, nous avons parlé des classes wrapper en Java, ainsi que du mécanisme d'autoboxing et d'unboxing.