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

avec Java Discussion :

Pourquoi les paramètres sont-ils assignables ?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut Pourquoi les paramètres sont-ils assignables ?
    Hello,

    Venant du c++, le java me pose pas mal de problèmes, j'ai (enfin) compris pourquoi une fonction "swap" n'était pas possible en java, grâce à cet article, mais du coup je me pose une question, pourquoi est-ce que ces 2 lignes sont valides ?
    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
    19
    public void tricky(Point arg1, Point arg2)
    {
      arg1.x = 100;
      arg1.y = 100;
      Point temp = arg1;
      arg1 = arg2; // celle la
      arg2 = temp; // et celle la
    }
    public static void main(String [] args)
    {
      Point pnt1 = new Point(0,0);
      Point pnt2 = new Point(0,0);
      System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); 
      System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
      System.out.println(" ");
      tricky(pnt1,pnt2);
      System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); 
      System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);  
    }
    Modifier une copie d'une référence n'a que peut d'intérêt et est trompeur (quand on à pas l'habitude du moins).
    Bref je comprend pas trop pourquoi ces références sont assignables.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il me semble bien plus pragmatique d'autoriser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public int handleSkin(String skin) {
      // mise en conformité
      if(skin == null) {
        skin = DEFAULT_SKIN;
      }
     
      // vrai traitement
      return skin.length();
    }
    que de forcer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int handleSkin(String skinAsAnUnrefinedParameter) {
      // mise en conformité
      String skin;
      if(skinAsAnUnrefinedParameter == null) {
        skin = DEFAULT_SKIN;
      } else {
        skin = skinAsAnUnrefinedParameter;
      }
     
      // vrai traitement
      return skin.length();
    }
    Au passage, ces mêmes assignations sont aussi autorisées en C++ même si les paramètres ne sont pas des &-références. Auquel cas, les règles sont exactement les mêmes qu'en Java, avec exactement le même intérêt.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut
    Bonsoir,

    c'est valide parce que vous pouvez assigner une référence à une autre de même type (même class ou class parent). Si vous voulez interdire ça dans les methode vous pouvez utilisez le mot clé final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void tricky(final Point arg1, final Point arg2)
    {
      arg1.x = 100;
      arg1.y = 100;
      Point temp = arg1;
      arg1 = arg2; // probleme compilation
      arg2 = temp; //  probleme compilation
    }
    vous aurez :

    Compilation Errors Detected

    Line: 14
    final parameter arg1 may not be assigned

    Line: 15
    final parameter arg2 may not be assigned

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Au passage, ces mêmes assignations sont aussi autorisées en C++ même si les paramètres ne sont pas des &-références. Auquel cas, les règles sont exactement les mêmes qu'en Java, avec exactement le même intérêt.
    J'y avais pas pensé, mais effectivement c'est la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void tricky(Point *arg1, Point *arg2) {
    	// ...
    }
    Pour final, c'est du coup équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void tricky(Point *const arg1, Point *const arg2) {
    	// ...
    }
    Y a t'il un équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void tricky(const Point *arg1, const Point *arg2) {
    	arg1->x = 42; // 'x' cannot be modified because it is being accessed through a const object
    	arg1 = arg2; // ok, arg1 et arg2 pointent sur le même objet
    }
    (c'est affreux de bloquer sur des problèmes de ce genre, un jour je comprendrais la logique de ce langage, un jour...)

    edit: pas de const-correctness en Java, faut donc utiliser des wrappers sur des objets pour interdire les modifications. (http://stackoverflow.com/questions/1...-specific-to-c)

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pas besoin de chercher la logique très loin, si tu veux mon avis. Il a pas semblé utile d'en prévoir une, c'est tout.
    Personnellement je trouve qu'on a finalement un peu trop souvent des bugs parce que le programmeur "ne sait plus" s'il devrait pouvoir muter l'objet ou non, et qu'il le fait, provoquant une erreur incompréhensible due à un objet muté à un moment où il était totalement débile de le muter. Je suis donc pas vraiment d'accord avec le choix qui a été fait pour Java, mais bon, c'est comme ça.

    En C++ la const-correctness repose sur des annotations indiquant pour chaque méthode si oui ou non elle peut muter l'objet, et donc si oui ou non elle a le droit d'être appelée sur un objet à const-correctness. Et bien sûr il ne faut pas se tromper.
    J'imagine qu'à l'époque ça a dû sembler une contrainte exagérée, même si depuis Java 6 la mode de mettre des annotations pour tout est finalement revenue.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    Salut,
    Citation Envoyé par Iradrille Voir le message
    Y a t'il un équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void tricky(const Point *arg1, const Point *arg2) {
    	arg1->x = 42; // 'x' cannot be modified because it is being accessed through a const object
    	arg1 = arg2; // ok, arg1 et arg2 pointent sur le même objet
    }
    (c'est affreux de bloquer sur des problèmes de ce genre, un jour je comprendrais la logique de ce langage, un jour...)
    Il n'y a pas vraiment d'équivalent syntaxique...



    Mais perso je te conseillerai d'éviter de chercher des équivalences entre le C++ et Java.
    Même s'il s'agit de deux langages orienté objets avec une syntaxe relativement proche, ils ont chacun une approche très différentes !

    Un bon code C++ ne sera pas forcément adapté à Java, et inversement.


    a++

  7. #7
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    un jour je comprendrais la logique de ce langage
    Je ne comprend pas ce que tu veux dire par là... Inutile de savoir pourquoi un langage est fait comme ceci ou comme cela : ce qui compte c'est de savoir comment faire ceci ou cela. Comprendre un langage, c'est savoir lire sa doc.

  8. #8
    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
    @JoeChip : en comparaison de C++, Java a quand même une approche très différente de la POO, avec des notions très différentes.
    Il y a vraiment de quoi être troubler lorsqu'on passe de l'un à l'autre (et dans les deux sens).


    a++

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et si tu veux éviter de te confuser tu fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void tricky(final Point arg1, final Point arg2)

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

Discussions similaires

  1. Pourquoi les programmeurs sont-ils moins payés que les gestionnaires de programmes et les analystes métiers ?
    Par Hinault Romaric dans le forum Débats sur le développement - Le Best Of
    Réponses: 107
    Dernier message: 26/11/2014, 22h40
  2. Réponses: 2
    Dernier message: 06/05/2007, 22h37
  3. Réponses: 1
    Dernier message: 04/04/2007, 13h43
  4. Pourquoi les tables sont ouvertes par défaut ?
    Par Cazaux-Moutou-Philippe dans le forum WinDev
    Réponses: 1
    Dernier message: 21/10/2006, 22h16
  5. Les événement sont-ils synchrones ?
    Par fregolo52 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 27/09/2006, 16h44

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