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 :

[J2SE] intérêt du final dans : fonction( final int arg) ?


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [J2SE] intérêt du final dans : fonction( final int arg) ?
    Bonjour,

    J'ai trouvé du code java (sur Junit) avec ce type de déclaration de méthode que je ne connaissais pas en utilisant final:

    public void runTest ( final Test test, final RestResult result) { ...}

    J'ai tout d'abord pensé que :
    1/ cette déclaration permet d'imposer que l'argument utilisé par la méthode ait été déclaré comme final avant
    2/ OU avec cette déclaration on ne peut pas changer l'argument passé dans le corps de la méthode
    3/ OU la variable passée en argument devient final à partir de là ( ok c'est douteux, mais c'est pour mes cas de test)

    Après quelques tests vérificatifs je ne vois aucune de ces 3 suppositions vérifiées.

    Alors quid de cette déclaration ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    c'est quelquechose que tout le monde devrait faire mais bon c'est embetant....
    Cela permet d'avoir un parametre final est donc que l'on ne peux pas modifier... L'avantage et que si jamais on tente de modifier ce parametre accidentellement dans la fonction, la compilation indiquera que ce n'est pas possible...
    Il s'agit donc d'une securité connue mais c'est vraie que je ne l'ai pas rencontrée souvent dans des codes... meme deans les miens d'ailleurs car c'est contraingnant mais je pense que c'est une bonne habitude...

    Edit : enfin la je parlais par les types primitifs... En ce qui concernce les objets cela signifie que tu ne peux changer le "pointeur".
    test = new Test(... );
    dois renvoyer une erreur lors de la compilation....
    Le probleme du mot clef final est qu'associé avec des objects ne garantit pas que les objects ne changent pas, il garanti seulement que ta variable pointera toujours vers le meme objet...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Non, cela n'empeche pas la modification
    Mon problème est bien là : je pensai également que cette déclaration devait empêcher de modifier le param. Mais en faisant un test je m'appercois qu'il n'en est rien.

    Sur ma méthode de test suivante :

    ce que je teste : Class monObjet ; attribut name (avec set/get)

    la méthode de test :
    doIt ( final mon Objet arg ) { monObjet.setName("toto") }

    Il n'y a aucun frein a la modif de l'attribut monObjet.name !

    Donc on peux bien modifier l'objet passé en paramètre (j'ai aussi vérifié plus après dans mon code que la modif avait été effective).

    Alors où va t'on ?

    EDIT :

    OK, alors ta précision dans ton edit confirme effectivement ce que je vois. Ok, merci

  4. #4
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 303
    Points : 201
    Points
    201
    Par défaut
    Citation Envoyé par TabrisLeFol
    c'est quelquechose que tout le monde devrait faire mais bon c'est embetant....
    Cela permet d'avoir un parametre final est donc que l'on ne peux pas modifier... L'avantage et que si jamais on tente de modifier ce parametre accidentellement dans la fonction, la compilation indiquera que ce n'est pas possible...
    Il s'agit donc d'une securité connue mais c'est vraie que je ne l'ai pas rencontrée souvent dans des codes... meme deans les miens d'ailleurs car c'est contraingnant mais je pense que c'est une bonne habitude...

    Edit : enfin la je parlais par les types primitifs... En ce qui concernce les objets cela signifie que tu ne peux changer le "pointeur".
    test = new Test(... );
    dois renvoyer une erreur lors de la compilation....
    Le probleme du mot clef final est qu'associé avec des objects ne garantit pas que les objects ne changent pas, il garanti seulement que ta variable pointera toujours vers le meme objet...
    exact, ce qui explique l'erreur de pas mal d'entre nous quand ils manipulent les String

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut Re: [J2SE] intérêt du final dans : fonction( final int arg)
    Citation Envoyé par guile.rondins
    Bonjour,

    J'ai trouvé du code java (sur Junit) avec ce type de déclaration de méthode que je ne connaissais pas en utilisant final:

    public void runTest ( final Test test, final RestResult result) { ...}

    J'ai tout d'abord pensé que :
    1/ cette déclaration permet d'imposer que l'argument utilisé par la méthode ait été déclaré comme final avant
    2/ OU avec cette déclaration on ne peut pas changer l'argument passé dans le corps de la méthode
    3/ OU la variable passée en argument devient final à partir de là ( ok c'est douteux, mais c'est pour mes cas de test)

    Après quelques tests vérificatifs je ne vois aucune de ces 3 suppositions vérifiées.

    Alors quid de cette déclaration ?
    ben la reponse est la suivante:
    Si tu declares une inner classe a l interieur de cette methode, alors les methodes de l innerClass pouront utiliser:

    - Les variables d instance de la outer class
    - Les methodes de la outer class
    - Les variables final de la methode dans laquelle la inner class est declaree

    voila ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'une ligne finale dans une Listview bindé
    Par Harpist dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 30/07/2008, 10h06
  2. Pointeur int dans fonction récursive
    Par Invité dans le forum Débuter
    Réponses: 5
    Dernier message: 29/05/2008, 16h38
  3. Réponses: 0
    Dernier message: 31/01/2008, 11h43
  4. [URL Rewriting] Sans slash final dans l'URL
    Par yanice dans le forum Apache
    Réponses: 2
    Dernier message: 26/10/2007, 19h23
  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