Quel est le point de “dernier de la classe” en Java?
Je suis de lire un livre sur Java et il est dit que vous pouvez déclarer l'ensemble de la classe comme final
. Je ne peux pas penser à quelque chose où je ne l'utiliserais.
Je suis tout nouveau sur la programmation et je me demande si les programmeurs utilisent réellement ce que leurs programmes. S'ils le font, quand ils l'utilisent afin que je puisse mieux les comprendre et savoir quand les utiliser.
Si Java est orienté objet, et vous déclarez une classe final
, n'est-ce pas arrêter l'idée de classe ayant les caractéristiques des objets?
Vous devez vous connecter pour publier un commentaire.
Un
final
classe est simplement une classe qui peut pas être étendue.(Cela ne signifie pas que toutes les références aux objets de la classe serait agir comme si elles avaient été déclarées comme
final
.)Quand il est utile de déclarer une classe comme final est couvert dans les réponses de cette question:
Dans un certain sens, oui.
Par le marquage d'une classe de finale de désactiver une fonction puissante et flexible de la langue que de la partie de code. Certaines classes, cependant, ne devrait pas (et, dans certains cas, peut pas) être conçu pour prendre des sous-classement en compte dans le bon sens. Dans ces cas, il est logique de marque de la classe comme définitive, même si les limites de la programmation orientée objet. (Rappelez-vous cependant qu'une classe finale peut encore s'étendre à un autre non-finale de la classe.)
Article connexe: Java: Quand créer une classe finale
final
et laisser String ouvert pour l'extension? Ce serait en accord avec la "Ouvert-Fermé le Principe" mentionné dans le Sean Patrick Floyd post.En Java, les articles avec la
final
modificateur ne peut pas être changé!Cela comprend les dernières classes, les variables final et final méthodes:
final
modificateur ne peut pas être changé!", est trop catégorique et, en fait, pas tout à fait correct. Comme Grady Booch a mis, "Un objet a l'état, le comportement et l'identité". Bien que nous ne pouvons pas changer l'objet de l'identité d'une fois sa référence a été marqué comme final, nous avons une chance de changer son état par l'attribution de valeurs à sa non-final
champs (à condition, bien sûr, il y en a un.) N'importe qui qui est de la planification pour obtenir un Oracle Java Certification (comme 1Z0-808, etc.) devraient garder cela à l'esprit, car il pourrait y avoir des questions sur cet aspect, sur l'examen...Un scénario où le final est important, 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 vous exécutez ne peut pas être remplacée par quelqu'un.
Un autre scénario est d'optimisation: il me semble me rappeler que le compilateur Java inlines certains appels de fonction de finale de classes. Donc, si vous appelez
a.x()
et est déclaréfinal
, nous savons au moment de la compilation du code et peut inline dans la fonction appelante. Je n'ai aucune idée si c'est réellement fait, mais au final c'est une possibilité.Le meilleur exemple est
qui est immuable la classe et ne peut être prolongée.
Bien sûr, il n'y a plus que de simplement faire la classe au final d'être immuable.
Si vous imaginez la hiérarchie de classe comme un arbre (comme en Java), les classes abstraites ne peuvent être les branches et final classes sont celles qui ne peuvent être leafs. Les Classes qui entrent dans aucune de ces catégories peut être à la fois des branches et du feuillage.
Il n'y a pas violation de l'OO principes final est simplement d'offrir une belle symétrie.
Dans la pratique vous souhaitez utiliser final si vous souhaitez que vos objets soient immuables ou si vous êtes en train de rédiger une API, de signal pour les utilisateurs de l'API que la classe n'est tout simplement pas prévu pour l'extension.
Pertinentes de la lecture: Ouvert-Fermé Principe par Bob Martin.
Clé citation:
La
final
mot clé est le moyen pour appliquer cela en Java, si elle est utilisée sur les méthodes ou sur les classes.final
faire la classe fermée pour l'extension, plutôt que de les ouvrir? Ou suis-je le prendre trop à la lettre?final
sur une classe/méthode de déclaration n'aurait pas de sens si vous souhaitez que la mise en œuvre du code pour être fermées pour la modification, mais ouvert pour l'extension de l'hérédité.Le mot-clé
final
lui-même signifie que quelque chose est définitive et n'est pas censé être modifiés en aucune façon. Si une classe si marquéefinal
alors il ne peut pas être étendu ou sous-classés. Mais la question est pourquoi ne nous marque une classefinal
? IMO il y a plusieurs raisons:J'ai entendu dire que le marquage de la classe
final
améliore l'efficacité, mais franchement je ne pouvais pas trouver cet argument de peu de poids.Peut-être oui, mais parfois, c'est le but. Parfois, nous ne faisons que, pour atteindre de plus grands avantages de la sécurité, etc. en sacrifiant la capacité de cette classe à être étendu. Mais une dernière classe peut encore étendre une classe si elle doit.
Sur une note de côté, nous devrions préférez la composition au cours de l'héritage et
final
mot-clé aide réellement dans l'application de ce principe.Si la classe est marquée
final
, cela signifie que la classe de la structure ne peuvent pas être modifiées par les choses à l'extérieur. Où c'est le plus visible, c'est quand vous êtes en train de faire traditionnel polymorphisme d'héritage, essentiellementclass B extends A
juste ne fonctionnera pas. C'est essentiellement un moyen de protéger certaines parties de votre code (de mesure).Pour clarifier, le marquage de la classe
final
ne marque pas de ses champsfinal
et, comme telle, n'est pas de protéger les propriétés des objets réels, mais la structure de la classe à la place.Être prudent lorsque vous effectuez une classe "finale". Parce que si vous voulez écrire un test unitaire pour un dernier de la classe, vous ne pouvez pas sous-classe de cette classe final afin d'utiliser la dépendance-la rupture technique ", sous-catégorie et Remplacer la Méthode décrite dans le Michael C. Plumes " livre "Travailler Efficacement avec le Code existant". Dans ce livre, les Plumes, a déclaré, "Sérieusement, il est facile de croire que le scellé et la finale sont erronée erreur, qu'ils ne devraient jamais ont été ajoutés à des langages de programmation. Mais le vrai défaut, c'est nous. Lorsque nous dépendons directement sur les bibliothèques qui sont hors de notre contrôle, nous sommes juste des ennuis."
À L'ADRESSE DE LA DERNIÈRE CLASSE DE PROBLÈME:
Il y a deux façons de faire une classe finale. La première consiste à utiliser le mot-clé final dans la déclaration de classe:
La deuxième façon de faire une classe final est de déclarer la totalité de ses constructeurs privés:
Marquage définitif vous évite si trouver que c'est une vraie finale, pour démontrer regardez cette classe de Test. regarde le public au premier coup d'œil.
Malheureusement, puisque le seul constructeur de la classe est privée, il est impossible d'étendre cette classe. Dans le cas de la classe de Test, il n'y a pas de raison que la classe devrait être final. La classe de Test est un bon exemple de la façon dont implicite final classes peuvent causer des problèmes.
De sorte que vous devrait marquer en finale lorsque vous implicitement faire une classe de finale en faisant du constructeur privé.
final class
peut éviter de casser l'API publique lorsque vous ajoutez de nouvelles méthodesSupposons que sur la version 1 de votre
Base
classe que vous faites:et un client n':
Alors si dans la version 2 vous souhaitez ajouter un
method
méthode pourBase
:il serait briser le code du client.
Si l'on avait utilisé
final class Base
au lieu de cela, le client n'aurait pas été en mesure d'hériter, et la méthode la plus ne pas rompre l'API.Oui, parfois vous pouvez vous le voulez bien, que ce soit pour la sécurité ou des raisons de vitesse. C'est fait aussi en C++. Il peut ne pas être que applicables pour les programmes, mais encore plus pour les cadres.
http://www.glenmccl.com/perfj_025.htm
Une dernière classe est une classe qui ne peut pas être prolongé. Également d'autres méthodes pourraient être déclarée final pour indiquer que ne peut pas être remplacée par des sous-classes.
La prévention de la classe d'être sous-classé pourrait être particulièrement utile si vous écrivez des Api ou des bibliothèques et voulez éviter d'être étendue à modifier la base de leur comportement.
Un avantage de garder une classe de finale :-
Classe String est gardé finale, de sorte que nul ne peut ignorer ses méthodes et de modifier les fonctionnalités. e.g on ne peut changer la fonctionnalité de longueur() la méthode. Il retournera toujours la longueur d'une chaîne.
Développeur de cette classe ne voulait pas de l'une de faire évoluer les fonctionnalités de cette classe, il l'a gardé comme final.
Finale de classes ne peut pas être prolongé. Donc, si vous voulez une classe à se comporter d'une certaine façon, et ne pas surcharger les méthodes (avec peut-être moins efficace et plus code malveillant), vous pouvez déclarer l'ensemble de la classe comme finale ou de méthodes spécifiques que vous ne voulez pas être changé.
Depuis la déclaration d'une classe n'empêche pas une classe d'être instancié, il ne signifie pas qu'il va arrêter la classe d'avoir les caractéristiques d'un objet. C'est juste que vous avez à coller à l'méthodes juste la façon dont ils sont déclarées dans la classe.
pense de FINALE comme la "Fin de ligne" - le gars qui ne peut pas produire une descendance plus. Alors, quand vous voyez de cette façon, il ya des tonnes de scénarios réels que vous rencontrerez qui vous oblige à marquer une " la fin de la ligne de repère à la classe. Il est Domain Driven Design - si votre domaine exige qu'une ENTITÉ donnée (la classe) ne peut pas créer des sous-classes, puis le marquer comme FINAL.
Je note qu'il n'y a rien qui vous empêche d'hériter d'un "doit être marqué comme final" de la classe. Mais qui est généralement classé comme "abus de héritage", et de fait, parce que le plus souvent vous voudriez vous héritez d'une fonction à partir de la classe de base dans votre classe.
La meilleure approche est de regarder le domaine et laisser dicter vos décisions de conception.
Comme ci-dessus dit, si vous voulez que personne ne peut modifier la fonctionnalité de la méthode, alors vous pouvez la déclarer comme final.
Exemple: serveur d'Application fichier chemin d'accès pour le téléchargement, le fractionnement de la chaîne basée sur l'utilisation du décalage, de telles méthodes, vous pouvez le déclarer Finale, de sorte que ces fonctions de méthode ne sera pas modifiée. Et si vous voulez finales des méthodes dans une classe à part, puis de définir la classe en tant que classe Finale. Alors au Final la classe aura toutes les méthodes, lorsque, comme en Finale de la méthode peut être déclarée et définie dans le non-classe finale.
Android Arpenteuse de la classe est un bon exemple de cela.
http://developer.android.com/reference/android/os/Looper.html
L'Arpenteuse de la classe fournit un certain nombre de fonctionnalités qui n'est PAS destiné à être remplacée par une autre classe. Donc, pas de sous-classe ici.
Disons que vous avez un
Employee
classe qui a une méthodegreet
. Lorsque legreet
méthode est appelée, elle imprime simplementHello everyone!
. Donc, c'est la comportement attendu degreet
méthodeMaintenant, laissez
GrumpyEmployee
sous-classeEmployee
et remplacergreet
méthode comme indiqué ci-dessous.Maintenant dans le code ci-dessous ont un look à la
sayHello
méthode. Il fautEmployee
instance en tant que paramètre et appelle le salue méthode en espérant qu'il allait direHello everyone!
Mais ce que nous obtenons estGet lost!
. Ce changement de comportement est à cause deEmployee grumpyEmployee = new GrumpyEmployee();
Cette situation peut être éviter si le
Employee
classe a été faitefinal
. Imaginez la quantité de chaos un coup de programmeur pourrait causer siString
Classe n'a pas été déclarée commefinal
.Finale de la classe ne peut pas être prolongé plus loin. Si nous n'avons pas besoin de faire une classe pouvant être héritées en java,on peut utiliser cette approche.
Si nous avons juste besoin de faire certaines méthodes dans une classe à ne pas être substituée, nous ne pouvons mettre le mot-clé final en face d'eux. Il y a la classe est toujours héréditaire.
En java le mot-clé final utilise pour ci-dessous les occasions.
L'Orientation de l'objet n'est pas à propos de l'héritage, il est à propos de l'encapsulation. Et l'héritage des pauses d'encapsulation.
La déclaration d'une classe finale est parfaitement logique, dans beaucoup de cas. Tout objet représentant une “valeur” comme une couleur ou d'une somme d'argent pourrait être final. Ils se tiennent sur leur propre.
Si vous êtes l'écriture de bibliothèques, de faire vos classes finale, sauf si vous explicitement tiret pour être dérivée. Sinon, les gens peuvent tirer vos classes et de remplacer les méthodes, de casser votre hypothèses /invariants. Cela peut avoir des implications en matière de sécurité ainsi.
Joshua Bloch dans “Effective Java”, recommande la conception explicite de l'héritage ou de l'interdiction, et il note que la conception de l'héritage n'est pas si facile.