Friday, May 21, 2004

En Java, chaque objet est different... Ou presque...

Pour ceux d'entre vous qui connaissent le langage Java, vous savez surement que chaque objet cree n'est en fait qu'un pointeur vers l'adresse de l'objet qui est en memoire. La Virtual Machine (JVM) s'occupe elle meme d'allouer la memoire necessaire a l'objet, de le creer et retourne un pointeur vers ce nouvel objet. Ce qui est d'ailleurs une force du langage, puisque le developpeur n'a pas a gerer lui meme les allocations de memoire ainsi que de liberer cet espace memoire une fois l'utilisation de cet objet terminee. Le Garbage Collector s'occupe de liberer les objets n'ayant plus de references. (L'ennui c'est qu'on ne sais jamais quand (et si) le Garbage Collector liberera cet objet). Enfin bon, mon post n'a pas pour but de philosopher sur les vertues du Garbage Collector.

Comme la majorite de vous, j'ai toujours cru que chaque nouvel objet cree avait une adresse differente. Cette affirmation est exacte dans 99% des cas. Mais, en lisant dans mon bouquin de certification dimanche dernier, j'ai appris une chose bien interessante concernant les java.lang.String.

Prenons comme exemple le code suivant:
public class JambonClass {

String stringOne = "jambon";
String stringTwo = "jambon";

public static void main(String[] args) {
JambonClass obj = new JambonClass();

if (obj.stringOne == obj.stringTwo) {
System.out.println("Pareil");
} else {
System.out.println("Pas pareil");
}
}
}


Logiquement, l'output de la methode main() devrait retourner:
Pas pareil

Tout simplement parce que lorsque l'on veut comparer le contenu de deus Strings, on utilise la methode equals().

Cependant, pour cet exemple, l'output sera plutot:
Pareil

Pourquoi? Non pas parce que le contenu des deux String est identique (quoi qu'il faut admettre que c'est un peu vrai...), mais plutot parce qu'ils ont la meme adresse memoire.

Comment cela s'explque-t-il?
L'explication est simple, mais pas evidente si l'on n'a pas lu la specification de la JVM. En effet, a la compilation de la declaration de la premiere String (stringOne), le compilateur l'ajoute dans son "Pool de Strings Literales". Plus tard, lors de la compilation de la declaration de la deuxieme String (stringTwo), le compilateur verifiera si la chaie de caractere est deja presente dans le Pool. Si la String est deja dans le pool (ce qui est le cas), le compilateur lui assigne l'adresse de la string du pool, au lieu d'allouer de l'espace memoire pour un nouvel objet.

Ce mode de fonctionnement s'explique au fait que les Strings sont des objets immuables. Bref, quand une String est creer, il est impossible de la modifier. D'ailleurs, vous remarquerez que les methodes de l'objet String ont l'attribut static puisqu'elles retournent des nouvelles String au lieu de modifier l'originale. (ex. toUpperCase(), toLowerCase(), etc.)

C'est pour cela que lorsque l'on compare deux objets a l'aide de l'operatueur ==, Java compare les references des objets (adresse memoire) et non leur contenu.

Il faut donc etre vigilant, puisque les Strings d'un programme ne sont pas toujours dans la meme Classe comme dans l'exemple ci-dessus. Et surtout, ne jamais comparer d'objets a l'aide de l'operateur ==.

J'ai cru bon de partager cela avec vous car, il faut bien l'admettre, il est difficile de developper une application aujourd'hui sans utiliser la classe java.lang.String.

Bon code.

Tuesday, May 18, 2004

On en apprend tous les jours...

Comme certains d'entre vous le savent, j'ai entamme un processus de certification Java depuis le mois de janvier. Et je dois avouer qu'il y a une tonne de choses a apprendre meme pour un developpeur Java averti.

En effet, la certification exige que les candidats connaissent le language ainsi que le fonctionnement de la JVM de fond en comble. Alors, j'ai retrousse mes manches et je me suis rendu sur le site d'Amazon afin de me procurrer de quoi occuper le (tres peu) de temps libre qu'il me reste.

J'ai choisi 2 bonnes briques (de plus de 800 pages chacun...) . Le premier, The Complete Java Cerrtification Study Guide est plutot oriente connaissances alors que le deuxieme, Sun Certified Programmer & Developer for Java 2 Study Guide: Exam 310-035 & 310-027 (OUF! ca c'est du titre) est plutot oriente examen.

Je n'en suis qu'a la moitie du premier, mais je peux deja vivevement vous le recommander. Il a ete ecrit par deux auteurs qui sont, eux meme, employes de Sun Microsystems. L'un d'eux a concu le programme de certification Java alors que le deuxieme a participe a l'elaboration de nombreuses fonctionnalites dans la JVM. Inutile de dire que ce bouquin est rempli d'informations utiles. Contrairement aux autres briques que j'ai eu l'occasion de lire, celle-ci se distingue par une explication detaillee de chaque fonctionnalites du language, comment la JMV reagit en fonction du code envoye (peu de livres ont des explications la dessus). Il y a meme des questions a la fin de chaque chapites (qui sont assez tordues d'ailleurs...) qui vous donnent une idee du genre de questions qui pourraient etre posees a l'examen.

Enfin bon, a ce jour, j'ai termine la partie language (les Inner-Classes et les Threads sont les chapiters les plus ardus) pour m'attaquer aux Classes constituant le JDK. (Packages java.util et java.lang). Je n'aurais jamais cru apprendre des choses nouvelles sur la classe java.lang.String, mais laissez moi vous dire qu'il ya bien des choses, que l'on prend pour acquis, que la JVM n'interprete pas de la meme facon. J'expliquerai plus en details lors d'un prochain BLOG.

Je n'ai pas encore eu le temps de jeter un oeil a mon deuxieme bouquin. Je vous ferai part de mes impressions lors de sa lecture.

Le precessus de certification est assez simple en soit (on passe un examen, pour avoir droit de passer le suivant). Mais ces examens sont loins d'etre simples et (evidemment) plus le niveau montera, plus la matiere sera difficile. Mais bon, puisque ma blonde est en plein cycle d'etude pour son concours d'orthodentie, Cela me permet d'avoir un cadre de travail aligne sur le sien.

Des heures de plaisir en perspective.

Thursday, May 13, 2004

Mercredi Star Trek

C'est mercredi! Et comme tous les mercredis soirs (depuis que je suis en France), c'est la soiree Star Trek. En effet, j'ai droit a deux episodes en ligne. (Quoi que, du temps que j'etais a Paris, on avait droit a trois...)

Mais la perte d'un episode est quand meme bien compensee. Puisque, du temps des 3 episodes, on n'avait que des reprises. Alors que maintenant, on a droit a un nouvel episode chaque semaine de Star Trek Enterprise. La nouvelle serie. Evidemment, puisque la France est pas super fan de ST, on a droit a la saison 1 alors qu'au Canada, ils achevent la saison 3. (Mais bon, on va pas trop se plaindre non plus...)

Pour les moins trekkies d'entre vous, je me suis permis de vous faire un (tres) bref expose des differentes series que composent l'univers Star Trek.


Star Trek (Serie Originale)

C'est la serie originale avec Mr. Spock et le Capitaine Kirk. Elle a ete produite vers la fin des annees soixantes. Cette serie a engendre de nombreux films (7 ou 8 je crois...) Mais il faut avouer qu'ils sont pas tous super... (inutile de se rappeler de celui ou ils reviennent a notre epoque pour chercher des baleines !!!)


Star Trek The Next Generation

C'est vraiment la serie qui a fait de moi un fan. Cette serie se passe 75 ans apres l'epoque du capitaine Kirk et met en vedette le Capitaine Picard (c'est celui qui joue le professeur Xavier dans les films X-Men). Tout comme l'originale, elle a engendre des films au cinema (5). Bien que je suis un tres grand fan de The Picard, je dois malheureusement avouer qu'ils sont pas tous excellents. Mais bon, la serie a quand meme dure 7 ans, ce qui fait qu'il me reste beaucoup de DVDs a acheter...


Star Trek Deep Space Nine

Cette serie se deroule en parallele de Star Trek The Next Generation. Mais au lieu d'un vaisseau qui parcours la galaxie, c'est une base spatiale qui agit comme decors. La serie met en vedette Le Capitaine Sisko Je dois avouer que j'aimais pas Sisko au debut, il avait vraiment un look de graine. Mais apres quelques saisons, ils l'ont relooke et il faut avouer que ca le faisait pas mal... Ce qui est quand meme bien dans DS9 (Deep Space Nine), c'est qu'ils ont vraiment pousse l'univers Star Trek a grande echelle. On n'a jamais vu autant de races en meme temps. ans oublier les excellentes scenes de bataille de (vraiment beaucoup) de vaisseaux contre (encore beaucoup) de vaisseaux....


Star Trek Voyager

De toutes les series Star Trek, celle la m'a presque laisse aussi froid que la premiere "kitch" des annees 60. Des le debut, on sent que la sauce est pas la. Le capitaine est une femme (moi ca me choque pas, mais l'actrice est pas du tout charismatique). Un petit vaisseau, avec peu de moyens (jamais assez de champ de force, jamais une arme assez puissante, etc) De surcroit, l'histoire mets en vedette l'equipage du vaisseau Voyager qui se fait aspirer dans une sorte de vortex et ils se retrouvent a des millions d'annees lumieres de la terre. Leur but, revenir sur terre, avec toutes les embuches que ca implique. Ils rencontrent plein de races c'est vrai (mais aucune de l'univers Star Trek). A force de vouloir jouer trop different, je crois qu'ils se sont trop eloignes de ce que les fans aiment. Mais bon, c'est mon avis...


Star Trek Enterprise

C'est la toute derniere serie de l'univers Star Trek. Cependant, cette serie se passe 115 ans avant la serie originale. Ce qui donne lieu a un concept interessant. A cette epoque (si on peut s'exprimer ainsi) il n'y a pas de traducteur universel, les teleporteurs tuent les humains une fois sur 5. De plus, ils reprennent une tonne de vieux trucs qui etaient "kitch" de la premiere serie et ils trouvent moyen de rendre ca utile. Et puisqu'au Canada, ils en sont a la 3e saison, c'est signe que ca marche plutot bien.


Ouf! ca suffit pour le bourrage de crane Star Trek.

Live Long and Prosper...


Tuesday, May 11, 2004

Y a un debut a tout.

Comme tout le monde commence a avoir un BLOG, je me suis dit qu'il etait grand temps que j'en ai un moi aussi.