• [^] # Re: Utiliser les tty

    Posté par . En réponse à la dépêche Patch pour le noyau Linux améliorant l'interactivité entre les applications console et Xorg. Évalué à 10.

    Non c'est simplement que tu ne comprends pas ce que tu fais.

    1- Quand tu fais un new tu obtiens *toujours* un objet différent

    System.out.println(new Integer(12) == new Integer(12)); => false

    2- Quand tu fais System.out.println(a++ == b++) tu ne fais pas du *tout* ce que tu penses. Tu ne comprends donc pas le mécanisme d'autoboxing de Java
    Integer a = new Integer(12); a++
    Ca donne en Francais.

    Pars d'un Integer, convertis le en int, ajoute lui un, convertis en Integer

    Soit en bytecode:
    0 new java.lang.Integer [16]
    3 dup
    4 bipush 12
    6 invokespecial java.lang.Integer(int) [18]
    9 astore_1 [a]
    10 aload_1 [a]
    11 invokevirtual java.lang.Integer.intValue() : int [21]
    14 iconst_1
    15 iadd
    16 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [25]
    19 astore_1 [a]


    3- Les versions objet des types primitif en Java sont immutable.

    4- Il en découle que a n'est évidement plus le même objet quand tu fais ton a++. Il s'agit d'un nouvel objet créer par le valueOf

    5- Rien n'empeche le valueOf d'optimiser ce qu'il retourne comme il le veut. La spec dit:
    The result is an Integer object that represents the integer value specified by the string.


    6- Pour optimiser la consommation mémoire, valueOf() utilise un cache d'entier pour certaines valeurs:

    private static class IntegerCache {
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static {
    for(int i = 0; i < cache.length; i++)
    cache[i] = new Integer(i - 128);
    }
    }


    Bref la spec est entièrement cohérente et chaque fonctionnalité est orthogonale. Certains ne comprennent pas les mécanismes de base comme l'autoboxing ou les specs de certaines méthodes, c'est leur problème. Faut arrêter de cracher sur les technos par ce qu'on est pas compétent dessus... Java comme n'importe quel autre langage à des spécifications. Soit on code à l'arrache de manière empirique; soit on lit les specs et on comprend comment ca marche.


    PS: Fait attention la JVM optimise aussi les strings. "toto" n'est pas du tout la même chose de new String("toto"). L'un te garanti l'unicité de l'objet pas l'autre.