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 :

Comment déconseiller ou interdire aux utilisateurs d'appeller une méthode ?


Sujet :

avec Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Comment déconseiller ou interdire aux utilisateurs d'appeller une méthode ?
    Bonjour,

    Je code en java depuis 3 ans mais aujourd'hui, je rencontre un problème que je n'ai jamais rencontré auparavant.

    Voilà je fais un programme utilisant les design pattern et en fait, j'ai une méthode qui est appelée par un autre objet du programme et j'aimerais bien savoir comment "bloquer" ou dire aux personnes qui reprennent mon code de ne pas utiliser cette méthode.

    Ce n'ai pas bien grave mais c'est toujours bon de savoir comment faire.

    Je pensais la déprécier dans la javadoc mais je ne pense pas que ce soit le meilleur moyen.

    Merci d'avance


    Cordialement,
    Quentigus

  2. #2
    Membre éprouvé Avatar de anisj1m
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 067
    Points : 955
    Points
    955
    Par défaut
    Citation Envoyé par quentigus Voir le message
    Voilà je fais un programme utilisant les design pattern
    Comment va servir cela pour décrire votre question

    ok juste je rigole,

    mais bien sure tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Deprecated
    public type name_method(params){}
    Ce qu'on appelons le hasard n'est que notre incapacité à comprendre un degré d'ordre supérieur.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par anisj1m Voir le message
    Comment va servir cela pour décrire votre question
    C'est juste que c'est à cause d'un DP que je rencontre ce problème.

    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    L'annotation @Deprecated doit être strictement réservées aux méthodes obsolètes, et non aux méthodes dont on voudrait restreindre l'utilisation.

    Pour limiter l'utilisation d'une méthode, il faut jouer sur sa visibilité :
    1. private : La méthode est visible uniquement dans la classe et les classes internes
    2. default (sans modificateur) : La méthode est visible dans le package
    3. protected : La méthode est visible dans les sous-classes
    4. public : La méthode est visible dans tous les packages et toutes les classes

    Chaque niveau de visibilité hérite de la visibilité des niveaux inférieurs.

    Toutefois, il est préférable d'avoir des niveaux de visibilité permissifs pour rendre plus souple l'utilisation de son api. On peut ensuite simplement ajouter dans la javadoc que telle méthode est destinée à un usage interne ou qu'il est préférable d'utiliser un adapter ou un factory, par exemple, dont on fournie le lien avec l'annotation javadoc @see.

  5. #5
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    +1 verbose.

    Utiliser le design pattern Factory.
    Créer une interface de la classe concernée sans inclure la dîtes méthode.

    Puis dans la factory :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static InterfaceDeMonObjet createObjet(param){
    InterfaceDeMonObjet ref = new MonObjet(param);
    return ref;
    }
    Quand tu utilises une factory, normalement, tu n'as plus jamais besoin de faire de new sur tes Objets, tu fais toujours des factory.createMonObjet(param);

    Nb : Comme dirait mon prof : " Toute classe doit posséder une interface "
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  6. #6
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    protected est parfois utilisé pour ça.
    que veut dire "protected" : voici une méthode qui est un mécanisme interne.
    elle est à la disposition de la classe courante et des classes du même package.
    Certes elle est également accessibles aux sous-classes mais en ce qui concerne l'instance courante (this.methode()).
    donc les autres codes (en dehors de ton package) vont se faire jeter s'ils l'utilisent (en dehors d'un héritage)...
    plus simple encore: une méthode sans rien: elle ne sera accessible qu'aux classes du même package.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  7. #7
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    La question n'étant pas tranchée et précise, ma réponse ne le sera pas plus :

    Si tu veux déconseiller l'utilisation d'une méthode car elle n'est pas performante, être remplacé, envisager un autre algorithme pour son intégration dans l'algorithme appelant, etc. C'est @deprected qu'il faut utiliser.

    Si tu veux déconseiller l'utilisation d'une méthode car c'est pour un algorithme spécifique, un usage interne, etc. Alors tu ne veux pas le déconseiller mais l'interdire.

    Si tu veux interdire l'utilisation d'une méthode, il existe deux moyens : les niveaux de visibilité et la "sécurité".
    Pour le premier je ne pense pas qu'après 3 ans de Java tu es besoin d'une explication.
    Pour le second j'adopte en général l'approche simple suivante :
    • Ajouter un attribut "securityKey" de type quelconque T (Object fera très bien l'affaire)
    • Ajouter au(x) constructeur(s) un paramètre de type T pour initialiser l'objet en question.
    • Ajouter aux méthodes "sécurisés" un paramètre "key" de type T.
    • Ajouter un assert aux début des méthodes pour assurer que "key" et "securityKey" sont soit les mêmes objets, soit égaux.


    Il te restera à partager convenablement l'instance (ou les valeurs) de "securityKey" entre l'initialisation de ton objet et les méthodes appelantes.

    Pour aller plus loin ou pour utiliser des mécanismes plus complexe (et éventuellement se passer de rajouter un paramètre, notamment si tu implémentes une interface que tu ne peux pas modifier) tu peux utiliser un Security Manager, ou encore des Thread-locale variables.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Cool ! merci à vous tous je prends note de tout. Pour l'instant j'ai passé ma méthode dans la visibilité par défaut et en jouant sur les packages.

    @Ivelios : ton idée de factory peut être pas mal mais recréer mon objet à chaque fois n'est pas super pratique du fait que je modifie souvent ses attributs et va prendre de la mémoire pour pas grand chose (même si le garbage collector fait son boulot enfin c'est ce que je pense, je me trompe peut-être).
    Citation Envoyé par Ivelios Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static InterfaceDeMonObjet createObjet(param){
    InterfaceDeMonObjet ref = new MonObjet(param);
    return ref;
    }


    @Nemec : je testerais bien ta méthode 2 mais je ne vois pas trop comment faire. Est-ce tu aurais un bout de code ou autre pour avoir un exemple ?
    Citation Envoyé par Nemek Voir le message
    Pour le second j'adopte en général l'approche simple suivante :
    • Ajouter un attribut "securityKey" de type quelconque T (Object fera très bien l'affaire)
    • Ajouter au(x) constructeur(s) un paramètre de type T pour initialiser l'objet en question.
    • Ajouter aux méthodes "sécurisés" un paramètre "key" de type T.
    • Ajouter un assert aux début des méthodes pour assurer que "key" et "securityKey" sont soit les mêmes objets, soit égaux.


    Il te restera à partager convenablement l'instance (ou les valeurs) de "securityKey" entre l'initialisation de ton objet et les méthodes appelantes.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    n'oubliez pas que les limitation que vous imposez à vos objets ne devraient pas être excessives. Je me souviens d'une application où on avait besoin de manipuler un object X qui avait été créé de telle manière qu'il était impossible d'en hériter (classe final) et les propriétés dont on avait besoin étaient toutes privées. Résultat: après une semaine de tergiversations sur la manière d'obtenir le résultat voulu, une tartine d'appel via reflection.

  10. #10
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Citation Envoyé par quentigus Voir le message
    @Ivelios : ton idée de factory peut être pas mal mais recréer mon objet à chaque fois n'est pas super pratique du fait que je modifie souvent ses attributs et va prendre de la mémoire pour pas grand chose (même si le garbage collector fait son boulot enfin c'est ce que je pense, je me trompe peut-être).
    Le GC fait son boulot comme il veut, quand il veut et quand il peut. Pour résumer si t'as pas besoin de mémoire il se tourne les pouces.
    Ceci dit pour les objets temporaires il fait assez bien son travail.

    Citation Envoyé par quentigus Voir le message
    @Nemec : je testerais bien ta méthode 2 mais je ne vois pas trop comment faire. Est-ce tu aurais un bout de code ou autre pour avoir un exemple ?
    Assez difficile d'être plus explicite Tout est marqué.
    Qu'est-ce que tu n'arrives pas à faire ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le problème des assert Nemek, c'est que beaucoup de gens font tourner leur JVM avec les assertions désactivée, ca risque de ne pas se remarquer que ce n'est pas utilisable

  12. #12
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    C'est pas activé par défaut sur la 1.6 ? En tout cas chez moi j'ai ajouté aucune option pour les activer.
    Pour les version inférieurs je n'ai pas testé.

    On peut facilement remplacer un assert par un bon vieux "if". C'est pour faire plus court
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    activé par défaut mais souvent désactivé explicitement. Ca dépend des écoles de pensées :p

  14. #14
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par Nemek Voir le message
    C'est pas activé par défaut sur la 1.6 ?
    ah bon? D'ou vient cette information? j'étais convaincu qu'au runtime c'était désactivé par défaut .... t'es sûr que c'est pas uniquement dans le cadre de codes de compile time (pour des Processeurs d'annotations par exemple?).
    merci pour tout lien qui confirmerait/infirmerait ce point.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    les assertions sont désactivées par défaut:
    http://java.sun.com/developer/techni...LP/assertions/

    Par contre eclipse (et peut etre netbeans) les active pour tout code lancé depuis l'IDE.

  16. #16
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Par contre eclipse (et peut etre netbeans) les active pour tout code lancé depuis l'IDE.
    testé sur éclipse: mon eclipse (helios) ne le fait pas par défaut, netbeans non plus (je dois avoir un sort jeté sur mon ordi) seule l'option -ea dans le projet le déclenche....
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Assez difficile d'être plus explicite Tout est marqué.
    Qu'est-ce que tu n'arrives pas à faire ?
    En fait, j'ai compris en essayant de le coder hier et sa marche bien. J'aurais du essayer avant de demander.

    Et puis l'assert, un petit tour sur la javadoc et sur google et hop c'est fonctionnel

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    testé sur éclipse: mon eclipse (helios) ne le fait pas par défaut, netbeans non plus (je dois avoir un sort jeté sur mon ordi) seule l'option -ea dans le projet le déclenche....
    Et t'es contagieux. Je sais pas pourquoi, la dernière fois que j'ai lancé des unit tests les assert dans le code marchaient et plus maintenant, mais t'as raison, c'est toujours à la demande

    Bon week-end.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/04/2007, 18h07
  2. Comment appeler une méthode dont le nom est dans un string?
    Par Ireon dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 13/04/2007, 17h22
  3. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55

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