OVH Cloud OVH Cloud

Wrapper de primitives

8 réponses
Avatar
gath
Salut tous le monde

J'ai remarqu=C3=A9 une petite diff=C3=A9rence en java 1.5.0 et 1.4.2 que je=
ne m'explique pas.

Pourquoi est-il possible (dans la version 1.5.0) de d=C3=A9clarer et de com=
piler ceci ?
(ca ne me semble pas logique d'attribuer une valeur de la sorte):
Boolean bool =3D true;
alors que dans la version 1.4.2 il me met des erreurs.
Ne devrait-on pas plutot utiliser :
Boolean bool =3D new Boolean(true);
qui lui fonction dans 1.50 et 1.4.2

J'ai le m=C3=AAme comp=C3=B4rtement avec Interger, Long, ...=20
Est-ce normal ? Ca me semble bizzar :s

--=20
Julien Ghaye=20=20=20=20=20=20=20=20=20=20=20=20=20=20

8 réponses

Avatar
jlp
C'est le mécanisme autoboxing introduit en 1.5
"gath" a écrit dans le message de
news:
Salut tous le monde

J'ai remarqué une petite différence en java 1.5.0 et 1.4.2 que je ne
m'explique pas.

Pourquoi est-il possible (dans la version 1.5.0) de déclarer et de compiler
ceci ?
(ca ne me semble pas logique d'attribuer une valeur de la sorte):
Boolean bool = true;
alors que dans la version 1.4.2 il me met des erreurs.
Ne devrait-on pas plutot utiliser :
Boolean bool = new Boolean(true);
qui lui fonction dans 1.50 et 1.4.2

J'ai le même compôrtement avec Interger, Long, ...
Est-ce normal ? Ca me semble bizzar :s

--
Julien Ghaye
Avatar
jeje900ss
gath wrote:

J'ai remarqué une petite différence en java 1.5.0 et 1.4.2 que je ne m'explique pas.

Pourquoi est-il possible (dans la version 1.5.0) de déclarer et de compiler ceci ?
(ca ne me semble pas logique d'attribuer une valeur de la sorte):
Boolean bool = true;
alors que dans la version 1.4.2 il me met des erreurs.
Ne devrait-on pas plutot utiliser :
Boolean bool = new Boolean(true);
qui lui fonction dans 1.50 et 1.4.2



Comme répondu précedement c'est une nouvelle fonctionnalité du 1.5
(l'autoboxing).

C'est bien d'avoir fait la remarque, car l'autre jour je voyais un
débutant en Java qui utilisait ce mécanisme sans s'en rendre compte et
en fait du coup il avait une lacune pour comprendre la différence entre
les type primitif et objet.
Et ne comprenait pas que ce genre de chose :
Integer toto = new Integer(5);
Integer tata = new Integer(5);
System.out.println(toto == tata);

renvoi false...

Jérôme

Avatar
gath
jeje900ss writes:

gath wrote:
J'ai remarqué une petite différence en java 1.5.0 et 1.4.2 qu e je ne
m'explique pas.
Pourquoi est-il possible (dans la version 1.5.0) de déclarer et de
compiler ceci ?
(ca ne me semble pas logique d'attribuer une valeur de la sorte):
Boolean bool = true;
alors que dans la version 1.4.2 il me met des erreurs.
Ne devrait-on pas plutot utiliser :
Boolean bool = new Boolean(true);
qui lui fonction dans 1.50 et 1.4.2



Comme répondu précedement c'est une nouvelle fonctionnalità © du 1.5
(l'autoboxing).

C'est bien d'avoir fait la remarque, car l'autre jour je voyais un
débutant en Java qui utilisait ce mécanisme sans s'en rendre co mpte et
en fait du coup il avait une lacune pour comprendre la différence
entre les type primitif et objet.
Et ne comprenait pas que ce genre de chose :
Integer toto = new Integer(5);
Integer tata = new Integer(5);
System.out.println(toto == tata);

renvoi false...


Il est clair que ca risque d'embrouiller plus d'un débutant.
Surtout que d'après ce que j'ai compris, le sytème interne de la jvm
n'a pas changé a ce niveau. c'est juste le compilateur qui effectue
ces auto(un)boxing ... on n'est plus obligé de le faire manuellement.

Dites moi hein si je dis des conneries ;-) Je n'ai débuté java qu 'il
y a 3 bon mois, je suis encore loin d'en maitrisé tt les paramètr es.
(Un tit clin d'oeil à mon cervau, qui a eu l'idée de tenter de co mpiler
mon code pour 1.5.0 avec la version 1.4.2, sans quoi la distinction
entre 'Boolean' et 'boolean' me serait encore restée floue un bout
de temps)

Julien


Avatar
TestMan
C'est le mécanisme autoboxing introduit en 1.5
"gath" a écrit dans le message de
news:
Salut tous le monde

J'ai remarqué une petite différence en java 1.5.0 et 1.4.2 que je ne
m'explique pas.

Pourquoi est-il possible (dans la version 1.5.0) de déclarer et de compiler
ceci ?
(ca ne me semble pas logique d'attribuer une valeur de la sorte):
Boolean bool = true;
alors que dans la version 1.4.2 il me met des erreurs.
Ne devrait-on pas plutot utiliser :
Boolean bool = new Boolean(true);
qui lui fonction dans 1.50 et 1.4.2

J'ai le même compôrtement avec Interger, Long, ...
Est-ce normal ? Ca me semble bizzar :s



1.5 "Autoboxing"
http://www.javaspecialists.co.za/archive/newsletter.do?issue 0&locale=fr_FR

Et perso, en 1.4 j'aurais préféré voir :

Boolean bool = Boolean.TRUE;

;-)

A+

TM

Avatar
Ced
Il est clair que ca risque d'embrouiller plus d'un débutant.
Surtout que d'après ce que j'ai compris, le sytème interne de la jvm
n'a pas changé a ce niveau. c'est juste le compilateur qui effectue
ces auto(un)boxing ... on n'est plus obligé de le faire manuellement.


C'est donc une chance que Eclipse (par exemple) permet de signaler,
grâce à une coloration syntaxique à paramétrer (couleur + gras? +
italique? + barré?), les lignes dans lesquelles un autoboxing se
produit.

Au moins, les débutants qui prendront la peine de configurer Eclipse
pourront voir à tout moment où et quand se font ces autoboxings dans
leur code.

Moi je dis "Bravo Eclipse". Mais bon, il n'est peut-être pas le seul
à le permette... NetBeans, peut-être ?

Cédric Olmanst

Avatar
Ced
Surtout que d'après ce que j'ai compris, le sytème interne de la jvm
n'a pas changé a ce niveau. c'est juste le compilateur qui effectue
ces auto(un)boxing ...


J'ai lu que ça se faisait au runtime (donc à l'exécution, et non à
la compilation), ce qui est donc pénalisant du côté des
performances.

Quelqu'un peut confirmer ?

Cédric Olmanst

Avatar
Olivier Thomann
J'ai lu que ça se faisait au runtime (donc à l'exécution, et non à
la compilation), ce qui est donc pénalisant du côté des
performances.
Quelqu'un peut confirmer ?
Je confirme. Non seulement c'est pénalisant, mais dans 90% des cas, ca

ne sert strictement a rien. L'autoboxing est de mon point de vue une
énormité puisque le développeur peut ne plus se rendre compte quand
c'est réalisé. Sa seule raison d'être est de simplifier le code.
--
Olivier

Avatar
Ced
Et est-ce qu'on n'exagèrerait pas un peu l'impact sur les performances
?
Est-ce que quelqu'un a déjà fait un benchmark pour voir ?