9
votes

La consommation excessive de finale peut-elle faire plus de bien?

Pourquoi les gens sont-ils si emphatiques quant à la fabrication de chaque variable dans une classe "finale"? Je ne crois pas qu'il y ait un véritable avantage à ajouter des variables locales finales à des variables locales privées ou d'utiliser une finale pour autre chose que des constantes et de passer des variables dans des classes intérieures anonymes.

Je ne cherche pas à commencer une sorte de guerre de la flamme, je veux juste honnêtement savoir pourquoi cela est si important pour certaines personnes. Est-ce que je manque quelque chose?


5 commentaires

"Utiliser final libéralement" - JavaPracces.com/topic/topicaction.do?id== 23


Vous avez des réponses qui soulignent les avantages, je veux demander où pensez-vous que cela pourrait être blessé?


Qu'est-ce qu'une "variable locale privée"? Voulez-vous dire un champ privé ou une variable locale? Les gens peuvent avoir des opinions différentes sur les deux cas et votre question empêche de ne pas savoir quel ou si vous voulez dire les deux.


@Thilo, il peut être plus difficile de lire quand tout commence par le même mot


Je suppose que je voulais dire des variables locales ... qui sont privées par le fait que c'est local. :) Je dois dire que je ne crois pas que l'utilisation finale libéralement pour transmettre l'intention est meilleure que de ne pas utiliser finale pour transmettre l'ouverture pour faire tout ce qu'un développeur se sent nécessaire à faire. Peut-être que des gains de performances mineures, mais je pense que la seule intention que je vois des développeurs à l'aide de la finale sur tout est qu'ils ont l'intention d'utiliser final sur tout sans comprendre pourquoi aucun domaine particulier doit être définitif. Je ne vois que "Développeur imposseur" quand je vois "final" plâtré partout.


8 Réponses :


4
votes

Il marque que je ne m'attends pas à ce que la valeur change, qui est la documentation gratuite. La pratique est que ce clairement communique l'intention de cette variable et oblige le compilateur à vérifier cela. Au-delà de cela, cela permet au compilateur de faire des optimisations.


6 commentaires

Voulez-vous dire que vous ne vous attendez pas à la référence de la variable de changer? Sont ces variables de classe privée ou locales?


Tout - lorsque quelqu'un lit le code, ils peuvent voir que la valeur (ou la référence) que je assigne sur cette ligne est ce que je l'attribue sur cette ligne pendant la durée de la portée. En ce qui concerne les champs de membres de classe final , il oblige ces variables à définir dans chaque constructeur, ce qui est un bon garde contre des erreurs logiques.


Oui, je suis bon avec l'utilisation finale pour faire une classe immuable. Une belle fonctionnalité en fait. Ce dont j'ai des difficultés, c'est quand quelqu'un utilise des variables finales dans une méthode. MyMethod privé (final BigDecimal Money) {Final MyCalc Calc = Nouveau MyCalc (); retour calc.doublemymoney (argent); } Je ne vois pas la nécessité de faire la finale de Mycalc. Cela aide-t-il vraiment la collecte des ordures? Est-ce que cela rend le code plus performant?


@IM: Il demande au compilateur de détecter et d'empêcher les affectations accidentelles à la variable (qui entraînera probablement des bugs logiques). Ceci n'est pas seulement sur les performances d'exécution.


@IM: Il identifie également la variable comme une constante, ce qui facilite la tâche des mortels des États-Unis. Une chose de moins à garder une trace de.


De plus, les IDES le soutiennent souvent, ce qui est encore meilleur que le support du compilateur.



14
votes
  1. Intention. D'autres personnes modifiant votre code ne changeront pas de valeurs qu'ils ne sont pas censées changer.

  2. Les optimisations du compilateur peuvent être apportées si le compilateur sait que la valeur d'un champ ne changera jamais.

    En outre, si chaque variable d'une classe est définitive (comme vous vous référez à votre message), vous avez une classe immuable (tant que vous n'exposez pas les références à des propriétés mutables), ce qui est un excellent moyen d'atteindre Sécurité du fil.


12 commentaires

Est-ce que cela aide vraiment avec les optimisations? Si une variable n'est pas modifiée après l'initialisation, le compilateur déterminera que la variable est marquée ou non.


Oui Michael, j'ai aussi entendu cela. Où avez-vous appris cela? Je ne peux pas sembler trouver des documents qui décomposent ces optimisations du compilateur.


Si vous ajoutez finale à toutes les variables, même les variables de la méthode locales, car vous croyez que la référence indique que les points de variable ne doivent pas être écrasés, n'est-ce pas un peu plus protecteur? Les mauvais codeurs feront de mauvaises choses, de bons codeurs font de bonnes choses. Il n'y a rien pour empêcher un mauvais codeur d'être stupide et écraser une référence d'objet. L'utilisation excessive de «finale» ne cesse pas de cela, en fait, il engourdit probablement les gens à une importance réelle d'utiliser finale. C'est mon point, je suppose.


"Les mauvais codeurs feront de mauvaises choses, de bons codeurs font de bonnes choses". Les bons codeurs font toujours des erreurs d'orthographe (telles que l'attribution de la mauvaise variable) et d'aimer des outils pouvant attraper ceux-ci.


@Tim: Non, l'utilisation de finale sera arrêter cela. C'est une erreur de compilation pour essayer d'attribuer une variable marquée finale une seconde fois.


'Final' n'est qu'un des pré-requis pour une immuabilité. Pour une classe parfaitement immuable, vous auriez également besoin de 1. Assurez-vous que la classe est définitive ou que toutes les méthodes que vous fournissez sont finales. 2. Tous les objets non primitifs et autres objets composés doivent être de manière clonée de manière approfondie. 3. Toutes les méthodes utilisant n'importe quel objet interne devraient avoir profondément cloné l'attribut, puis l'utiliser. Vous pouvez lire les détails sur le même à, azcarya.blogspot.com/2007/ 10 / immuables-classes.html


Final sur les variables locales fera une différence pour les fichiers de classe, afin que vous ne puissiez pas aider les performances. Il est important de distinguer les variables locales et les champs. / final ne fait pas référence à un objet mutable dans une constante.


@Sandy - Je ne pense pas que vous lisiez la partie où j'ai précisé qu'aucune référence à des propriétés mutables ne peut être exposée. Cela couvre vos cas 2 et 3.


@Tom Hawtin - changé "variable" dans "champ" au point 2 pour la clarté.


@Tom Hawtin - Tackline: Oui, j'ai mal souttenu cette finale n'empêcherait pas une référence d'objet d'être écrasée. Ce que j'aurais dû écrire, c'est que le contenu d'un objet est toujours modifiable, même si une variable est définitive. Mon point est que ce n'est pas une bonne idée d'utiliser finale sur une variable sans un but spécifique à ce champ / méthode / classe. Je ne pense pas que le but soit des optimisations du compilateur (donc chaque domaine est final) ou d'empêcher un développeur stupide d'écraser une référence d'objet (chaque domaine est final).


Je vais marquer cette question comme réponse choisie parce que c'est vrai ce que Danben dit. J'ajouterai que mon opinion est que les gens ne devraient pas utiliser définitive libéralement parce que cela ne signifie rien quand tout est final, sans but spécifique (voir commentaire précédent).


Vous n'avez pas du tout un objet inhumible. Vous n'avez qu'une référence immuable .... Cette information est trompeuse.



0
votes

Je pense que l'utilisation de la finale des valeurs intérieures à une classe est une overkilleuse à moins que la classe ne soit probablement héritée. Le seul avantage concerne les optimisations du compilateur, ce qui peut sûrement bénéficier.


6 commentaires

Quand tu dis "Overkill", que voulez-vous dire? C'est-à-dire qu'est-ce que c'est trop?


Les gens mentionnent des optimisations du compilateur, mais j'ai entendu cela avec des avancées récentes dans le compilateur, que le dernier mot-clé n'aide pas l'optimiseur. Je n'ai pas pu trouver de la documentation officielle à ce sujet, alors je ne suis pas sûr où les gens obtiennent cette rumeur.


Chaque variable de classe unique (qui fait une classe immuable) et chaque variable locale dans les méthodes. Tant de lignes de code dans une classe commencent par "finale". Je trouve cela très difficile à lire et je me débats avec les avantages.


@IM: Que vous devez taper finale partout dans l'endroit n'est pas si agréable (pas parce que vous êtes obligé de le taper, mais que la plupart des gens ne l'ourlent pas même la variable devrait être définitive). "Final" devrait peut-être être la valeur par défaut pour certaines situations (telles que les paramètres de méthode formels). Mais c'est trop tard maintenant.


En excédant, je voulais dire qu'il est inutile d'être écrit ... ils n'apporteront aucune valeur. Encore une fois, faire une finale de classe et toutes les variables finales ne créent pas de classe immuable parfaite, mais oui, sont les étapes nécessaires pour le faire.


@Thilo: Je suis d'accord avec votre déclaration. Merci.



3
votes

Il est important car immutabilité est important, en particulier lorsqu'il s'agit d'un modèle de mémoire partagé. Si quelque chose est immuable, il est un fil de sécurité, cela rend suffisamment d'argument à suivre comme une meilleure pratique.

http://www.artima.com/intv/blochp.html


3 commentaires

Oui, mais cela n'est pas pertinent pour les variables et les paramètres locaux car ils ne sont visibles que sur le fil actuel.


Parfois, vous devez les faire définir, parfois vous ne le faites pas, dépend de la situation. Une meilleure pratique a toujours des exceptions à la règle.


Les classes intérieures anonymes sont la seule fois où vous devez les faire définir.



2
votes

Un projet que je travaille actuellement est configuré de manière à ce que chaque fois que l'on appuie "Enregistrer" dans Eclipse, le modificateur final est ajouté à chaque variable ou champ non modifié dans le code. . Et il n'a pas encore blessé personne.


2 commentaires

@Bozho: Est-ce que Eclipse fait-il par défaut ou avez-vous besoin d'un plugin? Savez-vous s'il y a quelque chose de similaire pour Intellij Idea?


@WizardOfodds: Non, son constructeur d'ant, qui appelle à son tour une tâche personnalisée de la plate-forme de commerce électronique que nous utilisons.



3
votes

Un avantage pour la programmation simultanée qui n'a pas encore été mentionné:

Les champs finaux sont garantis pour être initialisés lorsque l'exécution du constructeur est terminée.


0 commentaires

1
votes

Il y a beaucoup de bonnes raisons d'utiliser finale, comme indiqué ailleurs. Un endroit où il ne vaut pas la peine, imo, est sur des paramètres à une méthode. Strictement parlant, le mot clé ajoute de la valeur ici, mais la valeur n'est pas suffisamment élevée pour résister à la syntaxe laid. Je préférerais exprimer ce type d'informations via des tests unitaires.


0 commentaires

11
votes

L'inconvénient, est-ce

annoy it is hard
annoy to read
annoy code or anything
annoy else when it all 
annoy starts in the 
annoy same way


0 commentaires