La raison de base de Java n'est pas détecter toutes inaccessible déclarations, c'est qu'il est généralement impossible de dire si le code est accessible ou pas. Cela découle du fait que le problème de l'arrêt est indécidable sur des machines de Turing.
Donc, il est clair que toutes inaccessible instructions ne peuvent pas être détectés, mais pourquoi ne pas essayer d'évaluer les conditions? Imaginez maintenant que la condition n'est pas juste false
, mais quelque chose comme ~x == x
. Par exemple, tous ces énoncés imprimer true
pour chaque int x
(source).
System.out.println((x + x & 1) == 0);
System.out.println((x + -x & 1) == 0);
System.out.println((-x & 1) == (x & 1));
System.out.println(((-x ^ x) & 1) == 0);
System.out.println((x * 0x80 & 0x56) == 0);
System.out.println((x << 1 ^ 0x1765) != 0);
Les déclarations peuvent être plutôt compliqué; il faut du temps pour les résoudre. Elle augmenterait de manière significative le temps de construction, et après tout, il ne détecte pas tous inaccessible consolidés. Compilateur a été conçu pour prendre quelques efforts, mais ne pas dépenser trop de temps pour ça.
La seule question demeure: où s'arrêter résoudre conditions? Les raisons qui ne semblent pas avoir de justification mathématique et sont basés sur l'utilisation de scénario. Justification de votre cas particulier est donné par JLS-14.21