IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

final dans les variables d'une méthode


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut final dans les variables d'une méthode
    Bonjour à tous

    soit le code suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    final CResources resources = x.Get_Resources();
    final int resourcesCount = resources.Get_Count();
    for (int i = 0; i < resourcesCount; i++) {
    	final String resourceId = resources.Get_Tag(i);
    	final CRoutes routes = resources.Get_Routes(i, -1);
    	final int WorkDayCount = Integer.valueOf(resources.Get_Details(i));
    	for (int j = 0; j < WorkDayCount; j++) {
    J'ai déclaré tout en constantes, je n'ai effectivement pas besoin de les
    modifier après leur création.
    Ma question porte plutôt sur les us et coutumes de la programmation Java.
    Outre l'aspect erreur de compilation en cas de réaffectation, y-a-t il qq
    chose à gagner (temps de traitement, mémoire...) à faire ainsi ?

    Les bonnes pratiques de la programmation Java sont elles plutôt orientées vers
    ce genre de solution ou plutôt à laisser les déclaration sans final ?

    merci
    Julien

  2. #2
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Bonjour,

    Personnellement je ne met des final que si cette variable doit etre une constante.
    La dans ton code tes varibla n'on pas de reson d'etre final donc je n'en metrait pas.

    Pour les gains je pence que le compilateur et plus douer que nous pour ce genre d'optimisation. Le compilo déclarera les variable final si il y a un gain.

    Cordialement.

  3. #3
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    Personnellement je ne déclare final que des variables d'instance de type primitif, ou des "constantes d'instance".

    Au boulot j'ai remarqué que pas mal de méthodes sont déclarées avec des paramètres final. Je ne sais pas pourquoi mais je n'ai pas ce réflexe en java alors que je le faisais systématiquement en Delphi quand je ne voulais pas modifier la valeur dans la méthode.
    Sans doute parce qu'en delphi on se pose toujours la question de savoir si on met "var", "const" ou rien du tout. L'absence de pointeur en java fait que je n'y pense pas.
    En delphi en tout cas je sais que le compilo optimise lorsqu'on utilise const, en java je ne sais pas.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par unknow0 Voir le message
    Personnellement je ne met des final que si cette variable doit etre une constante.
    La dans ton code tes varibla n'on pas de reson d'etre final donc je n'en metrait pas.
    Pour une constante c'est effectivement très utile car le compilateur supprimera carrément la variable pour la remplacer par sa valeur.


    Maintenant dans le cas d'objet ou de primitifs "non-constante", cela permet de clarifier le code pour le developpeur : on sait que la variable ne sera plus affecté dans le code


    Citation Envoyé par unknow0 Voir le message
    Pour les gains je pence que le compilateur et plus douer que nous pour ce genre d'optimisation. Le compilo déclarera les variable final si il y a un gain.
    Oui il y a de forte chance qu'il le fasse quand même...

    Attention : en ce qui concerne les variables locales seulement : pour les attributs d'instance ou static le final est obligatoire pour que le compilateur puisse optimiser les accès à la variable

    Citation Envoyé par Mushroom7 Voir le message
    Au boulot j'ai remarqué que pas mal de méthodes sont déclarées avec des paramètres final.
    Cela permet d'éviter les réaffections érronés

    Citation Envoyé par Mushroom7 Voir le message
    En delphi en tout cas je sais que le compilo optimise lorsqu'on utilise const, en java je ne sais pas.
    Java peut optimiser les variables locales finales (y compris les paramètres), mais sauf erreur il le fait très bien même sans le mot-clef final si elles ne sont pas modifié pendant le traitement

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    Citation Envoyé par Mushroom7 Voir le message
    Au boulot j'ai remarqué que pas mal de méthodes sont déclarées avec des paramètres final.
    Citation Envoyé par adiGuba Voir le message
    Cela permet d'éviter les réaffections érronés
    Par réaffectation, tu entends bien "surcharge" ("final" sur une méthode), non ?

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JohnNC Voir le message
    Par réaffectation, tu entends bien "surcharge" ("final" sur une méthode), non ?
    Non non je parle d'affectation de variable.
    Exemple tout con qui ne provoque pas d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	private String value;
     
    	public void setValue(String value) {
    		value = value.toLowerCase();
    	}
    On a simplement oublier le this sur l'affectation de l'attribut d'instance, et du coup à cause du conflit de nom on fait l'affectation sur le paramètre ce qui est une erreur dans ce cas précis... mais qui passe à la compilation !

    En déclarant le paramètre final on aurait eu une belle erreur du compilateur pour nous prévenir du problème

    a++

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/09/2014, 11h07
  2. [2.x] Récupérer les variables d'une méthode dans un layout
    Par guilhemsymf dans le forum Symfony
    Réponses: 4
    Dernier message: 01/03/2012, 10h52
  3. Réponses: 8
    Dernier message: 19/10/2009, 11h00
  4. Réponses: 21
    Dernier message: 18/11/2008, 14h36
  5. Utilisation de final dans les parametres d'une methodes
    Par menzlitsh dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2007, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo