686 votes

Quel est l'intérêt de la "classe finale" en Java ?

Je suis en train de lire un livre sur Java et il dit que vous pouvez déclarer la classe entière comme final . Je ne vois pas comment je pourrais l'utiliser.

Je suis nouveau dans le domaine de la programmation et je me demande si les programmeurs utilisent réellement ceci dans leurs programmes . Si c'est le cas, quand l'utilisent-ils pour que je puisse mieux le comprendre et savoir quand l'utiliser.

Si Java est orienté objet, et que vous déclarez une classe final L'idée d'une classe ayant les caractéristiques d'un objet ne s'arrête-t-elle pas ?

631voto

aioobe Points 158466

Tout d'abord, je vous recommande cet article : Java : Quand créer une classe finale


Si c'est le cas, quand l'utilisent-ils pour que je puisse mieux comprendre et savoir quand l'utiliser.

A final est simplement une classe qui ne peut pas être prolongé .

(Cela ne signifie pas que toutes les références à des objets de la classe se comporteraient comme si elles étaient déclarées en tant que final .)

Les réponses à cette question traitent des cas où il est utile de déclarer une classe comme finale :

Si Java est orienté objet, et que vous déclarez une classe final L'idée d'une classe ayant les caractéristiques d'un objet ne s'arrête-t-elle pas ?

Dans un certain sens, oui.

En marquant une classe comme finale, vous désactivez une fonctionnalité puissante et flexible du langage pour cette partie du code. Certaines classes, cependant, ne devraient pas (et dans certains cas peut pas) être conçu pour prendre en compte la sous-classification de manière adéquate. Dans ces cas, il est logique de marquer la classe comme finale, même si cela limite la POO. (Rappelez-vous cependant qu'une classe finale peut toujours étendre une autre classe non finale).

64 votes

Pour compléter la réponse, l'un des principes d'Effective Java est de favoriser la composition plutôt que l'héritage. L'utilisation du mot-clé final contribue également à l'application de ce principe.

15 votes

"Vous le faites principalement pour des raisons d'efficacité et de sécurité." J'entends cette remarque assez souvent (même Wikipedia l'affirme) mais je ne comprends toujours pas le raisonnement derrière cet argument. Quelqu'un peut-il expliquer comment, par exemple, un java.lang.String non final aurait été inefficace ou non sécurisé ?

42 votes

@MRA Si je crée une méthode qui accepte une chaîne de caractères comme paramètre, je suppose qu'elle est immuable, car les chaînes de caractères le sont. Par conséquent, je sais que je peux appeler n'importe quelle méthode sur l'objet String en toute sécurité, sans modifier la chaîne passée. Si je devais étendre String et modifier l'implémentation de substring pour changer la chaîne réelle, alors l'objet String que vous pensiez immuable ne l'est plus.

208voto

andyqee Points 754

En Java, les éléments avec la balise final Le modificateur ne peut pas être changé !

Cela inclut les classes finales, les variables finales et les méthodes finales :

  • Une classe finale ne peut pas être étendue par une autre classe.
  • Une variable finale ne peut pas être réaffectée à une autre valeur
  • Une méthode finale ne peut pas être surchargée

74 votes

La vraie question est pourquoi pas ce que .

15 votes

L'énoncé suivant : "En Java, les éléments avec le symbole final le modificateur ne peut être changé !", est trop catégorique et, en fait, pas tout à fait correct. Comme le dit Grady Booch, "Un objet a un état, un comportement et une identité". Bien que nous ne puissions pas modifier l'identité d'un objet une fois que sa référence a été marquée comme finale, nous avons la possibilité de modifier son état, son comportement et son identité. état en attribuant de nouvelles valeurs à ses non final (à condition, bien sûr, qu'il en dispose.) Toute personne qui envisage d'obtenir une certification Oracle Java (telle que 1Z0-808, etc.) doit garder cela à l'esprit car il pourrait y avoir des questions sur cet aspect dans l'examen...

41voto

Shay Points 1004

Un scénario où la finale est importante, lorsque vous voulez prévenir l'héritage d'une classe, pour des raisons de sécurité. Cela vous permet de vous assurer que le code que vous exécutez ne peuvent pas être remplacés par quelqu'un.

Un autre scénario est celui de l'optimisation : Je crois me souvenir que le compilateur Java met en ligne certains appels de fonctions à partir de classes finales. Ainsi, si vous appelez a.x() et un est déclaré final nous savons au moment de la compilation quel sera le code et nous pouvons l'intégrer dans la fonction appelante. Je n'ai aucune idée si cela se fait réellement, mais avec final, c'est une possibilité.

8 votes

L'inlining n'est normalement effectué que par le compilateur just-in-time au moment de l'exécution. Cela fonctionne aussi sans final, mais le compilateur JIT a un peu plus de travail à faire pour être certain qu'il n'y a pas de classes d'extension (ou que ces classes d'extension ne touchent pas cette méthode).

0 votes

Un bon article sur la question de l'inlining et de l'optimisation se trouve ici : lemire.me/blog/archives/2014/12/17/

0 votes

> ne peut pas être annulé par quelqu'un Par qui ?

24voto

biziclop Points 21446

Si vous imaginez la hiérarchie des classes comme un arbre (comme c'est le cas en Java), les classes abstraites ne peuvent être que des branches et les classes finales sont celles qui ne peuvent être que des feuilles. Les classes qui n'appartiennent à aucune de ces catégories peuvent être à la fois des branches et des feuilles.

Il n'y a pas de violation des principes OO ici, la finale fournit simplement une belle symétrie.

En pratique, vous utiliserez final si vous souhaitez que vos objets soient immuables ou si vous écrivez une API, pour signaler aux utilisateurs de l'API que la classe n'est pas destinée à être étendue.

15voto

Sean Patrick Floyd Points 109428

Lecture pertinente : Le principe de l'ouverture et de la fermeture par Bob Martin.

Citation clé :

Les entités logicielles (classes, modules, Fonctions, etc.) doivent être ouvertes à extension, mais fermées pour modification.

El final est le moyen de faire respecter cette règle en Java, qu'il soit utilisé sur les méthodes ou sur les classes.

10 votes

@Sean : Ne le déclare pas final rendre la classe fermée pour l'extension plutôt qu'ouverte ? Ou est-ce que je le prends trop au pied de la lettre ?

4 votes

@Goran appliquer globalement la finale, oui. La clé est d'appliquer sélectivement la finale dans les endroits où vous ne voulez pas de modification (et bien sûr de fournir de bons crochets pour l'extension).

30 votes

Dans l'OCP, "modification" fait référence à la modification du code source, et "extension" fait référence à l'héritage de l'implémentation. Par conséquent, l'utilisation de final sur une déclaration de classe/méthode n'aurait pas de sens si vous voulez que le code d'implémentation soit fermé à la modification mais ouvert à l'extension par héritage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X