Question Quel est le but de "classe finale" en Java?


Je lis un livre sur Java et dit que vous pouvez déclarer la classe entière comme final. Je ne peux rien penser à ce que j'utilise.

Je suis juste nouveau à la programmation et je me demande si les programmeurs l'utilisent réellement sur leurs programmes. S'ils le font, 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 finalCela n'arrête-t-il pas l'idée de classe ayant les caractéristiques des objets?


422
2018-03-03 13:52


origine


Réponses:


S'ils le font, quand l'utilisent-ils pour que je puisse mieux le comprendre et savoir quand l'utiliser.

UNE final classe est simplement une classe ne peut pas être étendu.

(Cela ne signifie pas que toutes les références aux objets de la classe agiraient comme si elles étaient déclarées comme final.)

Quand il est utile de déclarer une classe comme final est couvert dans les réponses à cette question:

Si Java est orienté objet et que vous déclarez une classe finalCela n'arrête-t-il pas l'idée de classe ayant les caractéristiques des objets?

En un 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 ne devraient cependant pas (et dans certains cas pouvez pas) être conçu pour prendre en compte le sous-classement dans le bon sens. Dans ces cas, il est logique de marquer la classe comme finale, même si elle limite la POO. (Rappelez-vous cependant qu'une classe finale peut encore étendre une autre classe non-finale.)


Article connexe: Java: quand créer une classe finale


397
2018-03-03 13:55



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

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

  • Un cours final ne peut être prolongé par aucune autre classe
  • Une variable finale ne peut pas être réaffectée une autre valeur
  • Une dernière méthode ne peut pas être surchargée

155
2017-09-09 01:47



Un scénario où la finale est importante, quand vous voulez empêcher l'héritage d'une classe, pour des raisons de sécurité. Cela vous permet de vous assurer que le code que vous utilisez ne peut pas être remplacé par quelqu'un.

Un autre scénario concerne l'optimisation: il me semble que le compilateur Java intègre certains appels de fonctions des classes finales. Donc, si vous appelez a.x() et a est déclaré final, nous savons au moment de la compilation ce que sera le code et peut s’intégrer dans la fonction d’appel. Je n'ai aucune idée si cela est effectivement fait, mais avec le final c'est une possibilité.


27
2018-03-03 13:57



Le meilleur exemple est

Classe finale publique String

ce qui est une classe immuable et ne peut être étendue. Bien sûr, il n'y a pas que rendre la classe finale immuable.


17
2018-03-03 13:56



Si vous imaginez la hiérarchie de classes comme un arbre (comme 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 d'OO ici, la finale fournit simplement une belle symétrie.

En pratique, vous voulez utiliser final si vous voulez 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 à l’extension.


15
2018-03-03 13:59



Lecture pertinente Le principe ouvert-fermé par Bob Martin.

Citation clé:

Entités logicielles (classes, modules,   Fonctions, etc.) devrait être ouvert pour   Extension, mais fermée pour   Modification.

le final Le mot clé est le moyen de l'appliquer en Java, qu'il soit utilisé sur des méthodes ou sur des classes.


14
2018-03-03 14:01



Le mot-clé final elle-même signifie que quelque chose est final et n’est pas censé être modifié de quelque manière que ce soit. Si une classe est marquée final alors il ne peut pas être étendu ou sous-classé. Mais la question est pourquoi nous marquons une classe final? OMI il y a plusieurs raisons:

  1. Standardisation: Certaines classes exécutent des fonctions standard et ne sont pas destinées à être modifiées, par ex. classes exécutant diverses fonctions liées aux manipulations de chaînes ou aux fonctions mathématiques, etc.
  2. Raisons de sécurité: Parfois, nous écrivons des classes qui effectuent diverses fonctions liées à l'authentification et au mot de passe et nous ne voulons pas qu'elles soient modifiées par quelqu'un d'autre.

J'ai entendu ce cours de correction final améliore l'efficacité mais franchement je ne pouvais pas trouver cet argument pour porter beaucoup de poids.

Si Java est orienté objet, et que vous déclarez une classe finale, n'est-ce pas   arrêter l'idée de classe ayant les caractéristiques des objets?

Peut-être oui, mais parfois c'est le but recherché. Parfois, nous faisons cela pour obtenir de plus grands avantages de sécurité, etc. en sacrifiant la capacité de cette classe à être étendue. Mais une classe finale peut encore étendre une classe si nécessaire.

Sur un côté, nous devrions préférer la composition à l'héritage et final mot-clé aide réellement à appliquer ce principe.


9
2017-07-02 09:05



Si la classe est marquée final, cela signifie que la structure de la classe ne peut pas être modifiée par quelque chose d'extérieur. Là où c'est le plus visible est quand vous faites l'héritage polymorphique traditionnel, fondamentalement class B extends A ça ne marchera pas. C'est fondamentalement un moyen de protéger certaines parties de votre code (pour allonger).

Pour clarifier, marquer le cours final ne marque pas ses champs comme final et en tant que tel ne protège pas les propriétés de l'objet mais la structure réelle de la classe à la place.


5
2018-03-03 13:57