Pourquoi la méthode privée peut-elle être définitive?

Je me demande pourquoi ça va:

class SomeClass { //--snip-- private final void doStuff() { // private work here } } 

Si c’est privé, personne ne peut le remplacer, n’est-ce pas?

Pourquoi est-il possible d’append un mot clé final si cela n’a aucun effet? (ou quelque chose me manque?)

Fondamentalement, c’est permis parce qu’ils ne pensaient pas que cela valait la peine de mettre un cas spécial interdisant le modificateur private . C’est comme si vous pouviez aussi déclarer des méthodes sur une interface comme public , ou des classes nestedes dans une interface comme étant static , même si ces mots-clés sont impliqués dans des interfaces. Vous pouvez également déclarer les méthodes final sur un cours final , etc.

Java a pris la position de ne pas se plaindre lorsque vous ajoutez des modificateurs redondants. Ils le font régulièrement.

Cela rend le langage plus flexible mais le langage ne garantit pas qu’il aura un effet. Faire une méthode privée finale est un indice pour le compilateur ( JIT ).

La spécification du langage Java indique que:

Une méthode peut être déclarée finale pour empêcher les sous-classes de se substituer ou de la masquer.

C’est une erreur de compilation pour tenter de remplacer ou de masquer une méthode finale.

Une méthode privée et toutes les méthodes déclarées immédiatement dans une classe finale ( §8.1.1.2 ) se comportent comme si elles étaient finales, car il est impossible de les remplacer.

Au moment de l’exécution, un générateur de code machine ou un optimiseur peut “incorporer” le corps d’une méthode finale, en remplaçant une invocation de la méthode par le code de son corps. Le processus d’inclusion doit conserver la sémantique de l’appel de la méthode. En particulier, si la cible d’une invocation de méthode d’instance est null, une exception NullPointerException doit être lancée même si la méthode est en ligne. Un compilateur Java doit s’assurer que l’exception sera lancée au bon point, de sorte que les arguments réels de la méthode seront considérés comme ayant été évalués dans le bon ordre avant l’invocation de la méthode.

De Wikipedia :

Une idée fausse commune est que déclarer une classe ou une méthode comme final améliore l’efficacité en permettant au compilateur d’insérer directement la méthode partout où elle est appelée (voir extension en ligne). Mais comme la méthode est chargée à l’exécution, les compilateurs ne peuvent pas le faire. Seuls l’environnement d’exécution et le compilateur JIT savent exactement quelles classes ont été chargées, et ils sont donc les seuls à pouvoir décider du moment de l’intégration, que la méthode soit finale ou non.

Les compilateurs de code machine qui génèrent du code machine directement exécutable, spécifique à la plate-forme, constituent une exception. Lorsque vous utilisez des liaisons statiques, le compilateur peut supposer que les méthodes et les variables calculables au moment de la compilation peuvent être incorporées.

Un cas d’arête qui nécessite une méthode privée pour être finale, c’est quand l’annotation SafeVarargs est utilisée. Le code suivant ne comstack pas, car la méthode privée n’est pas définitive.

 @SafeVarargs private void method(List... ssortingngLists) { //TODO a safe varargs operation }