Aliases en Java

Pièges à éviter dans aliases en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

L'aliasing peut souvent provoquer plus du mal que du bien dans une application. C'est pourquoi il faut l'utiliser avec précaution.

Logiquement, un alias ressemble à une nouvelle couverture pour quelque chose qui existe déjà. Cela s'applique aux aliases dans les noms de domaines. On peut par exemple avoir 4 adresses différentes qui sont ensuite redirigés vers un site commun. La même chose s'applique en Java.

Si l'on crée un alias pour un objet déjà existant, toutes les modifications de cet alias vont se répercuter sur l'objet initialement créé. Autrement dit, un alias n'est pas une nouvelle instance d'une classe. Il est une sorte de représentation d'un objet déjà initialisé. On peut constater cela sur cet exemple :

afficher le code

Le résultat est :

The first part cat1 name = cat1 cat2 name = cat1 The second part cat1 name = cat2 cat2 name = cat2

On constate immédiatement que l'attribution du cat1 à Cat cat2 n'a pas créé une nouvelle instance de l'objet Cat. A la place de cela, il a créé un nouvel alias qui pointe vers l'instance conçue par Cat cat1 = new Cat("cat1").

En PHP, cela marchera de la même manière. La variable issue de l'alias deviendra alors un nouvel objet, indépendant du premier. Regardons cela sur un exemple :

afficher le code

Et le résultat :

The first part cat1 name = cat1 cat2 name = cat1 The second part cat1 name = cat2 cat2 name = cat2

Cette confusion potentielle est la raison principale pour laquelle on devrait éviter des aliases au maximum. A leur place on devrait privilégier le clonage des objets. On peut l'achever grâce à la méthode clone() qui reprend l'objet tel quel et crée une nouvelle instance dans la mémoire. On peut constater cela sur l'exemple amélioré du début :

afficher le code

Voici le résultat :

The first part cat1 name = cat1 cat2 name = cat1 The second part cat1 name = cat1 cat2 name = cat2

Dans notre classe Cat on a rajouté une implémentation de l'interface Cloneable qui permet de copier les objets. Grâce à cela on a une possibilité de manipuler deux instances distinctes de la même classe.

Il faut donc avoir en tête qu'un alias n'est pas égal à une nouvelle instance de la classe. Et que pour la générer, il faut soit utiliser la méthode clone(), soit passer par son constructeur.

télécharger les fichiers d'exemple
Bartosz KONIECZNY Informations sur le langage

Une question ? Une remarque ?

*

*

Un conseil JavaScript

Comment récupérer la hauteur de l'élément avec jQuery ?

On peut le faire avec deux méthodes. La première fonctionne correctement pour tous les navigateurs sauf Internet Explorer. Pour le cas des navigateurs Microsoft, elle marche uniquement quand la hauteur est spécifiée en dur :

$('#element').css('height')
L'alternative est la méthode height() qui est gérée par tous les navigateurs, même si l'élément a la hauteur "auto" :
$('#element').height();