certification java

OCPJP 6 – Jour 8 – Les Wrappers

Chacun des types primitifs peut être « enveloppé » dans un objet provenant d’une classe prévue à cet effet et appelée wrapper (mot anglais signifiant enveloppeur). Les enveloppeurs sont donc des objets représentant un type primitif.

Les wrappers vont permettre de manipuler les types primitifs comme des objets. Plus précisément, il existe des classes nommées Boolean, Character, Byte, Short, Integer, Long, Float et Double qui encapsulent des valeurs du type primitif correspondant (boolean, char, byte, short, int, long, float et double).

PrimitifClasse Wrapper
booleanBoolean
byteByte
charCharacter
doubleDouble
floatFloat
intInteger
longLong
shortShort

L’intérêt des wrappers est qu’ils peuvent être utilisés dans des mécanismes réservés aux objets, comme dans l’utilisation des collections par exemple. Enfin chaque wrapper possède des méthodes utilitaires qui permettent notamment des conversions d’un type à un autre, d’une base à une autre.

8.1 – Les constructeurs

Tous les wrappers (excepté le wrapper Character) disposent de deux constructeurs : le premier prend un primitif en paramètre et le deuxième une chaîne de caractères :

Le wrapper Character n’a qu’un seul constructeur qui prend en paramètre un caractère :

8.2 – Les méthodes utilitaires

Les classes wrappers proposent également des méthodes statiques utiles parmi lesquelles on retrouve deux méthodes qui permettent de convertir une chaîne de caractères vers un type primitif.

valueOf()

La méthode statique valueOf() prend en paramètre une chaîne de caractère et retourne un wrapper. Une seconde forme de cette méthode existe et prend comme deuxième argument la base (binaire, octale, hexadécimale, …) dans laquelle le premier paramètre est fourni :

Si la chaîne de caractères contient des caractères non numériques, une exception de type NumberFormatException sera levée.

xxxValue()

La méthode non statique xxxValue() (où xxx est un primitif) permet de convertir un wrapper en type primitif :

parseXxx()

La méthode statique parseXxx() (où Xxx est un wrapper) prend en paramètre une chaîne de caractères et retourne un primitif :

Une seconde méthode parseXxx() prend en paramètre une chaîne de caractères et la base dans laquelle le premier paramètre est fourni :

toXxxString()

La méthode statique toXxxString() (où Xxx est Binary, Octal ou Hex) prend en paramètre un primitif de type int ou long et retourne une chaîne de caractères convertie dans la base correspondante :

Seules les wrappers Integer et Long possèdent cette méthode.

8.3 – Autoboxing / Unboxing

L’autoboxing est une conversion automatique effectuée par le compilateur entre un type primitif et un wrapper. Par exemple, un primitif de type int peut automatiquement être converti en objet Integer, cette opération est l’autoboxing. L’opération inverse (Integer vers int) s’appelle l’unboxing.

L’autoboxing/unboxing permet des opérations telles que :

Les références des wrappers peuvent être nulles et le langage Java le permet. Cependant l’autoboxing sur une valeur nulle lèvera une exception de type NullPointerException :

Depuis le JDK 5.0, lors de l’auto/unboxing, le compilateur réalise des opérations supplémentaires invisibles pour le développeur :

CodeCode généré par le compilateur

Nous verrons dans un chapitre suivant que les collections ne peuvent contenir que des objets. L’autoboxing permet ainsi de convertir implicitement un primitif en objet wrapper pour être ajouté à une collection.

L’autoboxing ne peut pas convertir une primitive en un wrapper associé à une autre primitive :

Dans un chapitre suivant, nous étudierons en détail l’opérateur « == » et la méthode equals(). Pour comprendre ce qui va suivre, il faut simplement savoir que l’opérateur « == » compare deux références mémoires et la méthode equals() compare deux valeurs significatives.

Ce fonctionnement s’applique aussi aux wrappers :

Le code précédent affichera sur la sortie standard :

Cependant, l’opérateur « == » peut avoir un fonctionnement différent selon les valeurs des wrappers :

Le code précédent affichera sur la sortie standard :

Dans cet exemple, la valeur 4242 a été modifiée en 42 et les wrappers n’ont plus l’air d’être des objets différents. En effet, i1 et i2 pointent vers la même référence et c’est ainsi pour les entiers d’une valeur comprise entre -128 et 127. Comme ce sont des entiers utilisés régulièrement, ceux-ci sont gérés dans un cache interne. Si l’entier est en-dehors de cet intervalle, un nouvel objet wrapper est créé. Voici le détail de la méthode statique valueOf() :

Seuls les wrappers suivants sont concernés :

  • Boolean
  • Byte
  • Character : de 0 à 127 (\u0000 à \u007f)
  • Short : de -128 à 127
  • Integer : de -128 à 127

Il est donc très important d’utiliser avec précautions l’opérateur « == » pour comparer deux objets wrappers.


Auteur
AuteurEdouard WATTECAMPS

0 réponses

Répondre

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *