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][PARAMETRE] Interet?


Sujet :

Langage Java

  1. #1
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut [FINAL][PARAMETRE] Interet?
    hello,

    Je me posais la question suivante :

    quel est l'interet de declarer des parametres final?

    Est ce que cela indique que les parametres sont passé par valeur et non par reference?

    Merci d'avance,
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  2. #2
    Membre habitué Avatar de Oui-Oui MB
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 127
    Points
    127
    Par défaut
    Cela permet de ne pas pouvoir redéfinir la variable par après, dans le cas d'une variable.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    final int VALUE_FINAL = 1;
     
    private void maFct()
    {
      VALUE_FINAL = 2; // Pas permis...
    }
    Ca permet aussi, en l'utilisant avec "class" (-> final class Machin) de pas pouvoir faire un héritage sur cette classe.
    Que la Schtuche soit avec vous !!!

  3. #3
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Tu veux dire l'intérêt de faire ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void maMéthode (final MonObjet monParamètre){
     
    }

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  4. #4
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par Oui-Oui MB
    Cela permet de ne pas pouvoir redéfinir la variable par après, dans le cas d'une variable.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    final int VALUE_FINAL = 1;
     
    private void maFct()
    {
      VALUE_FINAL = 2; // Pas permis...
    }
    Ca permet aussi, en l'utilisant avec "class" (-> final class Machin) de pas pouvoir faire un héritage sur cette classe.
    Oui ca pas de probleme, je connaissais!
    Par contre, c'est l'utilisation dans le cas décrit par Descent.

    Ou je ne suis pas sur de comprendre...
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  5. #5
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par Descent
    Tu veux dire l'intérêt de faire ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void maMéthode (final MonObjet monParamètre){
     
    }
    Oui! Est ce pour un passage par valeur et non par reference?
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  6. #6
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par fabszn
    Citation Envoyé par Descent
    Tu veux dire l'intérêt de faire ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void maMéthode (final MonObjet monParamètre){
     
    }
    Oui! Est ce pour un passage par valeur et non par reference?
    Je ne pense pas, c'est juste l'intéret de passer une variable qui sera ensuite constante dans la méthode, mais ca ne change rien au passage par valeur ou référence

  7. #7
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Non rien à voir. De toute façon en Java tout est passé par valeur. Si si je te jure c'est vrai. Y'a moult discussions mouvementées sur le sujet.

    Sinon, l'intérêt de passer des paramètres en final, je crois que c'est simplement pour des effets d'optimisation. Tu sais que la valeur de ton paramètre ne change pas dans la méthode, tu le déclare en final de cette façon le compilateur java va pouvoir faire des optimisations dessus.

    C'est ce que j'ai compris en parcourant cette page (paragraphe D.1.2 New Uses for final).

    Note : cette page date un peu quand même...

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  8. #8
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Je ne vois pas l'interet..Ca donne un statut un peut ambigu à la variable!

    Qu'en pensez vous?

    [REEDITION]

    Oui moult et moult discussion à propos de passage par reference et non par valeur...

    Je viens de lire l'article.. je reviens sur ce que j'ai dit... Effectivement cela presente un interet pour l'optimisation... et cette notion de protection de parametre!

    Merci pour vos réponses! et pour le lien...
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  9. #9
    Membre habitué Avatar de Oui-Oui MB
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 127
    Points
    127
    Par défaut
    Dans ce cas, il ne faut plus parler de variable mais de paramètre dans le sens où celui-ci n'est jamais que lu.

    C'est un peu comme le const de C++. Ca permet de garantir que le paramètre ne changera pas au cours de la fonction.
    Que la Schtuche soit avec vous !!!

  10. #10
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Justement pas.

    Et c'est une bonne habitude à prendre de déclarer tout les paramètres de méthode finaux pour 2 raisons :
    - optimisation
    - vu que ce sont des paramètres de méthode, il n'y a aucune raison logique pour que leur valeur change.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  11. #11
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    en clair, on protege l'objet passé en parametre d'une modification dans la méthode (ca ne compile pas).
    Attention !!!
    Une référence à un objet déclarée finale ne permet pas de changer la référence. PAr contre l'objet, lui, peut être modifié.

    EDIT : Tiens... le message auquel je répond a disparu :p . Le fautif aurait-il remarqué sa faute ? ;)
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  12. #12
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par Satch
    en clair, on protege l'objet passé en parametre d'une modification dans la méthode (ca ne compile pas).
    Attention !!!
    Une référence à un objet déclarée finale ne permet pas de changer la référence. PAr contre l'objet, lui, peut être modifié.
    Ok... mais est ce que modifier l'objet presente un interet si la reference ne l'etre pas? :
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  13. #13
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par fabszn
    Ok... mais est ce que modifier l'objet presente un interet si la reference ne l'etre pas? :roll: :?:
    bien sur, ça permet d'être sur d'avoir toujours le même objet dans ta méthode.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class A {
       int i=0;
    }
     
    class Test{
     
       blabla blalba main (...){
     
         A a = new A();
         incremente(a);
     
      }
     
      static void incremente(final A a){
          a.i++; //permis
          a = new A(); // pas permis
      }
    }
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  14. #14
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Je pense que ça a quand même une utilité, notamment quand tu utilise des classes internes anonymes.

    Exemple tu ecrit une méthode qui ajoute un écouteur à un bouton pour que celui ci quand tu clique dessus affiche dans une boîte de dialogue la valeur de l'int que tu passe en paramètre de ta méthode (c'est bidon c'est juste pour l'exemple).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public void ajouterEcouteur(int valeurAAffichier){
           monBouton.addActionListener(new ActionListener(){
                       public void actionPerformed(ActionEvent e) {
                                   JOptionPane.showMessageDialog(null, valeurAAfficher);
                       }
           });
    }
    Dans le cas présent le code ne va pas compiler car lorsque une classe interne utilise une variable définie en dehors de celle-ci, il faut que cette variable soit final.

    Conclusion : il faut mettre le int valeurAAfficher en final comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public void ajouterEcouteur( final int valeurAAffichier){
           monBouton.addActionListener(new ActionListener(){
                       public void actionPerformed(ActionEvent e) {
                                   JOptionPane.showMessageDialog(null, valeurAAfficher);
                       }
           });
    }
    Et là, le compilateur ne va pas gueuler.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  15. #15
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Ha oui tiens, j'avais oublié ce détail. C'est toujours bon à rappeler :)
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  16. #16
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Je m'en souvenais car j'ai eu un cas comme ça récemment.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  17. #17
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par Descent
    Je pense que ça a quand même une utilité, notamment quand tu utilise des classes internes anonymes.

    Exemple tu ecrit une méthode qui ajoute un écouteur à un bouton pour que celui ci quand tu clique dessus affiche dans une boîte de dialogue la valeur de l'int que tu passe en paramètre de ta méthode (c'est bidon c'est juste pour l'exemple).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public void ajouterEcouteur(int valeurAAffichier){
           monBouton.addActionListener(new ActionListener(){
                       public void actionPerformed(ActionEvent e) {
                                   JOptionPane.showMessageDialog(null, valeurAAfficher);
                       }
           });
    }
    Dans le cas présent le code ne va pas compiler car lorsque une classe interne utilise une variable définie en dehors de celle-ci, il faut que cette variable soit final.

    Conclusion : il faut mettre le int valeurAAfficher en final comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public void ajouterEcouteur( final int valeurAAffichier){
           monBouton.addActionListener(new ActionListener(){
                       public void actionPerformed(ActionEvent e) {
                                   JOptionPane.showMessageDialog(null, valeurAAfficher);
                       }
           });
    }
    Et là, le compilateur ne va pas gueuler.
    Merci pour cet exemple.. effectivement, l'utilisation du parametre declaré final est clairement mis en evidence dans ce cas la!!
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


Discussions similaires

  1. interet de final pour une variable static
    Par john123 dans le forum Langage
    Réponses: 6
    Dernier message: 24/03/2011, 11h36
  2. Utilisation de final dans les parametres d'une methodes
    Par menzlitsh dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2007, 14h17
  3. Interet bloc Finally
    Par Seth77 dans le forum Langage
    Réponses: 7
    Dernier message: 11/10/2006, 11h43
  4. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59
  5. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15

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