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 :

Méthodes exportées : commentaires


Sujet :

Langage Java

  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Méthodes exportées : commentaires
    C'est dommage, sur les tutoriels, on ne peut pas "réagir" directement, c'est pourquoi je fais un post ici.

    Suite à cet article: Constructeurs et méthodes exportées

    Je voudrais juste rajouter que l'utilisation des méthodes exportées peut être dangereuse même si l'on n'est pas dans le constructeur... Et c'est quand même tentant si on a une méthode a(int i), et une méthode b() qui fait la même chose que a(5) d'appeler a(5) dans b().

    Et aussi que dans Swing (par exemple dans JTabbedPane), ils utilisent des "méthodes exportées" (je ne connaissais même pas le nom), car quand on redéfinit addTab(...) en mettant comme code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw new UnsupportedOperationException();
    (pour éviter qu'on puisse ajouter un onglet de l'extérieur), et bien ça plante dès le constructeur...

  2. #2
    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 ®om
    Je voudrais juste rajouter que l'utilisation des méthodes exportées peut être dangereuse même si l'on n'est pas dans le constructeur... Et c'est quand même tentant si on a une méthode a(int i), et une méthode b() qui fait la même chose que a(5) d'appeler a(5) dans b().
    Pour moi ce n'est pas vraiment dangereux en dehors des constructeurs... Au contraire c'est même plutôt utile...


    Citation Envoyé par ®om
    Et aussi que dans Swing (par exemple dans JTabbedPane), ils utilisent des "méthodes exportées" (je ne connaissais même pas le nom), car quand on redéfinit addTab(...) en mettant comme code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw new UnsupportedOperationException();
    (pour éviter qu'on puisse ajouter un onglet de l'extérieur), et bien ça plante dès le constructeur...
    Personne n'a jamais dit que l'API standard respectait toujours les bonnes règles de developpement

    a++

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par adiGuba
    Personne n'a jamais dit que l'API standard respectait toujours les bonnes règles de developpement
    C'est clair, il suffit meme de regarder le code source de Swing pour s'en rendre compte (mais bon, le code de Swing est bien mieux que celui de l'AWT soit dit en passant).
    C'est du genre "faites ce que nos didacticiels disent mais ne faites surtout pas ce qu'on fait nous". Mais bon, ce ne sont pas des pratiques qui sortent de l'ordinaire non plus .
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Par défaut
    Citation Envoyé par ®om
    Et aussi que dans Swing (par exemple dans JTabbedPane), ils utilisent des "méthodes exportées" (je ne connaissais même pas le nom), car quand on redéfinit addTab(...) en mettant comme code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw new UnsupportedOperationException();
    (pour éviter qu'on puisse ajouter un onglet de l'extérieur), et bien ça plante dès le constructeur...
    Oui d'accord mais ce n'est pas parceque tu redéfinis une méthode que tu dois changer le contrat de la méthode. Il n'a jamais été dit dans l'API de JTabbedPane que tu pouvais lever une exception de ce type en appelant la méthode addTab. A mon avis, pour limiter l'ajout d'onglets, il faudrait juste que tu ta méthode rédéfinie se contente de ne rien faire.

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par McFoggy
    Oui d'accord mais ce n'est pas parceque tu redéfinis une méthode que tu dois changer le contrat de la méthode. Il n'a jamais été dit dans l'API de JTabbedPane que tu pouvais lever une exception de ce type en appelant la méthode addTab. A mon avis, pour limiter l'ajout d'onglets, il faudrait juste que tu ta méthode rédéfinie se contente de ne rien faire.
    Je ne change pas le "contrat" de la méthode, UnsupportedOperationException étend RuntimeException... Si l'exception est levée au runtime, c'est que la méthode est exécutée (d'ailleurs il doit s'agir d'un add et non d'un addTab).

  6. #6
    Membre expérimenté
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Par défaut
    Pour moi changer le comportement d'une méthode en renvoyant même une RuntimeException est un changement de contrat.

    Si j'ai une méthode qui est susceptible de lever une exception Runtime elle est décrite dans la javadoc. Sinon c'est qu'elle n'en lève pas. Dans l'exemple suivant j'ai deux méthodes une qui est suceptible de lever une NPE et l'autre pas.
    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
        /**
         * @param s une chaine
         * @return la chaine en majuscule
         * @throws NullPointerException si la chaine est nulle
         */
        public String toUpperCase(String s) {
            return s.toUpperCase();
        }
     
        /**
         * @param s une chaine
         * @return la chaine en majuscule
         */
        public String toUpperCaseSafe(String s) {
            if (s!=null) {
                return s.toUpperCase();
            }
            return null;
        }
    Pour moi si jamais tu surcharges toUpperCaseSafe tu n'as pas le "droit" de lancer une NPE, c'est le contrat de ma méthode !

    Voilà c'est simplement mon interprétation du @throws qui n'est que trop peu souvent utilisé.

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    J'ai simplement suivi le comportement des unmodifiableCollection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection.unmodifiableList(maList);
    Ca renvoie une liste, et si tu fais un add dessus, ça renvoie un UnsupportedOperationException...

  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
    Citation Envoyé par ®om
    J'ai simplement suivi le comportement des unmodifiableCollection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection.unmodifiableList(maList);
    Ca renvoie une liste, et si tu fais un add dessus, ça renvoie un UnsupportedOperationException...
    Justement !

    Si tu regarde la doc de la méthode List.add(), tu peux lire ceci :
    Throws:
    UnsupportedOperationException - if the add method is not supported by this list.
    ClassCastException - if the class of the specified element prevents it from being added to this list.
    NullPointerException - if the specified element is null and this list does not support null elements.
    IllegalArgumentException - if some aspect of this element prevents it from being added to this list.
    Ce qui veut dire que la méthode peut renvoyer des UnsupportedOPerationException (entre autres). Donc le contrat est respécté...


    Ce n'est pas le cas des méthodes addTab() de JTabbedPane...

    a++

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Et donc que proposes-tu pour empêcher l'ajout d'onglets par une autre méthode?

    Ne rien faire est encore pire que de lever une UnsupportedOperationException, car tu ne t'en aperçoit même pas qu'il y a une erreur...

    (et si le constructeur appelle la méthode, que tu ne fasses rien ou que tu lèves une exception, au final il y aura un problème)

  10. #10
    Membre expérimenté
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Par défaut
    Citation Envoyé par ®om
    Ne rien faire est encore pire que de lever une UnsupportedOperationException, car tu ne t'en aperçoit même pas qu'il y a une erreur...
    Si ton but est de ne pas autoriser l'ajout au travers de cette méthode je ne vois pas comment ne rien faire pourrait être considéré comme une erreur ?

    Après je ne me suis pas plongé dans le code de JTabbedPane pour pouvoir dire si il faut faire de telle ou telle façon je disais simplement que si la méthode que tu surcharges ne précise pas des exceptions même Runtime alors tu ne dois pas en renvoyer.

  11. #11
    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 ®om
    Et donc que proposes-tu pour empêcher l'ajout d'onglets par une autre méthode?
    Cela ne me semble pas une mauvaise solution... mais le fait est que tu casses le contrat initial. Cela ne me choque pas mais peut avoir des effets nefaste (comme celui que tu décris).

    Remarque cela a déjà été fait par exemple pour la méthode add() des JFrame/JWindow qui provoquait une exception avant Java 5.0...

    Citation Envoyé par ®om
    Ne rien faire est encore pire que de lever une UnsupportedOperationException, car tu ne t'en aperçoit même pas qu'il y a une erreur...
    Tout à fait d'accord sur ce point.

    Citation Envoyé par ®om
    (et si le constructeur appelle la méthode, que tu ne fasses rien ou que tu lèves une exception, au final il y aura un problème)
    Tu aurais encore le code ? Parce qu'il y a une chose que je ne comprend pas : le constructeur de JTabbedPane ne semble pas faire appel à add() ou addTab()...

    Je viens de tester en redéfinissant toutes les méthodes add() ou addTab() pour qu'elles lancent une exception, mais je n'ai pas de problème à utiliser cette classe...

    a++

  12. #12
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Non j'avais supprimé ce code...

    Mais dès que je créais un JTabbedPane et que je l'ajoutais à un JPanel, ça plantait si les méthodes add() renvoyaient une exception...

Discussions similaires

  1. [XL-2007] Export commentaires excel vers power point
    Par arnest dans le forum Excel
    Réponses: 1
    Dernier message: 04/08/2012, 20h08
  2. Réponses: 2
    Dernier message: 15/12/2007, 21h24
  3. Export des commentaires des champs de table en mode création
    Par zigzagzoug dans le forum Modélisation
    Réponses: 5
    Dernier message: 11/10/2007, 18h50
  4. Commentaires "javadoc" méthodes et classes
    Par JohnNC dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 07/02/2007, 12h43
  5. [VS.net2003][IDE] Exporter la liste des méthodes
    Par arnolem dans le forum Visual Studio
    Réponses: 2
    Dernier message: 01/06/2006, 17h53

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