limites autoboxing

Le
ToOmS
Bonjour à tous,

Quelqu'un saurait-il ce qui se passe réellement dans le code suivant,
SVP ? J'ai fait un test compilé, bien sûr, mais je cherche à découv=
rir
les détails de ce problème.

Long toto = 1l;
Long titi = 1l;

if (toto == titi) {
System.out.println("comparaison des valeurs");
} else {
System.out.println("comparaison des références");
}

En effet, ce sont les valeurs qui sont comparées on ne peut donc
plus tester les références Je pensais que l'autoboxing était
déclenché lorsque les deux natures (objet et type simple) sont
confrontées dans une expression.

Merci d'avance !
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
ToOmS
Le #17393401
En mode debug, je m'apperçois que les deux variables ont le même ID.
Java crée donc un catalogue (ce sont des objet immuables, alors
pourquoi pas). Il est donc normal que la comparaison (même sur les
références) colle.

Mais avec l'exemple suivant, on a bien deux ID (et de toute façon une
expression dans la comparaison) :

Long toto = 10l;
Long titi = 1l;

if (toto == Long.valueOf(titi + 9l)) {
System.out.println("comparaison des valeurs");
} else {
System.out.println("comparaison des références");
}

et le résultat est le même (comparaison des valeurs)...
Mayeul
Le #17393971
ToOmS a écrit :
En mode debug, je m'apperçois que les deux variables ont le même ID.
Java crée donc un catalogue (ce sont des objet immuables, alors
pourquoi pas). Il est donc normal que la comparaison (même sur les
références) colle.

Mais avec l'exemple suivant, on a bien deux ID (et de toute façon une
expression dans la comparaison) :

Long toto = 10l;
Long titi = 1l;

if (toto == Long.valueOf(titi + 9l)) {
System.out.println("comparaison des valeurs");
} else {
System.out.println("comparaison des références");
}

et le résultat est le même (comparaison des valeurs)...



Je ne peux pas tester là maintenant, mais logiquement Long.valueOf()
devrait aussi utiliser le catalogue, et donc renvoyer une référence vers
le Long de valeur 10 qui existe déjà.

Si tu remplaces Long.valueOf(titi + 9l) par new Long(titi + 9l), ça
donnera false.

--
Mayeul
ToOmS
Le #17397801
On 1 oct, 19:32, Mayeul

Si tu remplaces Long.valueOf(titi + 9l) par new Long(titi + 9l), a
donnera false.



C'est exact, en effet. Et cela semble assez logique dans la mesure où
"new Long(titi + 9l)" dans une expression ne nécessite pas, par
définition, d'être catalogué (pas de référence à mettre dans le
stack ?).

Je remarque également que le code suivant :

Long toto = 10l;
Long titi = 1l;
titi += 9l;

Aboutit à l'égalité des ID entre toto et titi. Mais il est probable
que #valueOf est utilisé pour l'autoboxing.
ToOmS
Le #17397791
Pour info, les codes suivants aboutissent à des références séparé es :

Long toto = new Long(10l);
Long titi = new Long(1l + 9l);

Long toto = new Long(10l);
Long titi = new Long(10l);
Mayeul
Le #17398591
ToOmS a écrit :
Pour info, les codes suivants aboutissent à des références séparées :

Long toto = new Long(10l);
Long titi = new Long(1l + 9l);

Long toto = new Long(10l);
Long titi = new Long(10l);



C'est normal, c'est ce que veut dire new : construction d'un nouvel
objet, donc d'une référence vers ce nouvel objet.

Il me semble logique de ne pas faire de "new" pour l'auto-inbox si un
système de catalogue existe. Allouer et conserver de nouveaux objets
triviaux coûte cher quand on en abuse.

--
Mayeul
ToOmS
Le #17399771
On 2 oct, 10:45, Mayeul

Il me semble logique de ne pas faire de "new" pour l'auto-inbox si un
système de catalogue existe. Allouer et conserver de nouveaux objets
triviaux coûte cher quand on en abuse.



Tout à fait. Et si j'avais mieux compris(lu ?) l'API
Long#valueOf(long) au lieu de me fier aux vieilles habitudes, j'aurais
tout de suite compris la différence... J'ai définitivement besoin de
vacances !

Cela dit, on atteind bien, comme je le pressentais, certaines limites
de l'autoboxing ; on crée la confusion en laissant croire que la
comparaison de deux objets est celle de leurs valeurs. Quelques
cafouilles entre new et valueOF... et on l'a dans l'os !

Bonne fin de journée.
Publicité
Poster une réponse
Anonyme