Petit quizz pendant le week-end.

September 23rd, 2005 par Eric

Supposons que vous avez le code suivant :


public interface StaticFinalTest {
String LITERAL = "Literal";
String LITERAL_PLUS = "Literal" + "Plus";
String LITERAL_NEW = new String("LiteralNew");
String LITERAL_CONCAT = "LiteralConcat".concat("");
}

Et que vous l’utilisez avec cette classe :


public class StaticFinalTestClient {
public static void main(String[] args) {
System.out.println(StaticFinalTest.LITERAL);
System.out.println(StaticFinalTest.LITERAL_PLUS);
System.out.println(StaticFinalTest.LITERAL_NEW);
System.out.println(StaticFinalTest.LITERAL_CONCAT);
}
}

Vous allez obtenir :

Literal
LiteralPlus
LiteralNew
LiteralConcat

Maintenant vous changer l’interface par :

public interface StaticFinalTest {
String LITERAL = "LiteralXXX";
String LITERAL_PLUS = "Literal" + "PlusXXX";
String LITERAL_NEW = new String("LiteralNewXXX");
String LITERAL_CONCAT = "LiteralConcat".concat("XXX");
}

Qu’allez-vous obtenir ?

Oups il faut quand même que je vous laisse le temps de chercher…

Ce petit quizz n’étant pas de moi je vous laisse trouver la réponse sur JavaSpecialists.co.za. Vous pouvez vous abonner � la mailing list et consulter les versions précédentes.

8 Responses to “Petit quizz pendant le week-end.”

  1. Franck Says:

    Heu j’ai pas du comprendre la ruse !?
    J’ai eu comme je pensais:
    LiteralXXX
    LiteralPlusXXX
    LiteralNewXXX
    LiteralConcatXXX

  2. Eric Says:

    En fait tu devrais obtienir :
    Literal
    LiteralPlus
    LiteralNewXXX
    LiteralConcatXXX

    Mais il ne faut recompiler que l’interface (pas les deux) sinon tu obtiens bien ce que tu as.
    En fait cela consiste juste à montrer la difficulter de déterminer une compatibilité binaire entre des librairies.

  3. Franck Says:

    Ah ben tu précisais qu’il fallait avoir le code dans deux fichiers !
    J’avais tout mis dans le même fichier.
    ça me rappelle un temps où dans un projet, le mode debug était défini justement dans une interface et qu’il fallait tout recompiler pour avoir un mode sans debug (hein Freddy tu te rappelles ? ;-) ).

  4. Eric Says:

    Oups, désolé, je n’étais pas assez clair. Va quand même voir Javaspecialist, c’est un site vraiment intéressant.

  5. Freddy Mallet Says:

    Je suppose que l’explication se trouve du coté du compilateur qui à des fins d’optimisation copie directement les valeurs de LITERAL et LITERAL_PLUS dans la classe StaticFinalTestClient en ‘brisant’ ainsi le lien entre la classe et l’interface. Ce qui n’est pas le cas pour les deux autres valeurs ?

    un dis mon Eric, j’ai bon ?

  6. Eric Says:

    Monsieur Mallet, vous avez raison. Le compilateur remplace les objets static final par leur valeur lorsque celle-ci est constante et d’un type primitif ou String (car immutable), new String(”") n’est pas un ltéral et .concat non plus (c’est leur résultat qui est constant)

  7. Freddy Mallet Says:

    cool !!!
    Qu’est ce que j’ai gagné ?
    un voyage peut être ? ;-)

  8. Eric Says:

    Mon très chjer Freddy, voici ce que tu as gagné:
    * Le renouvellement de ma très grande estime pour toi,
    * Un bon pour un hébergement gratuit à Aix en Provence dans une magnifique villa avec piscine (sisi il suffit juste de la monter),
    * Un tour de moto ?

    :-)

Leave a Reply

You must be logged in to post a comment.