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 :

Metaclass pour customiser new


Sujet :

Langage Java

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut Metaclass pour customiser new
    Bonjour,

    En Python, je peux utiliser une métaclasse définissant __new__() pour customiser l'instanciation de mes objets (par exemple, renvoyer un objet existant plutôt qu'une nouvelle instance).
    Existe-t'il un méchanisme similaire en Java ?

    Merci d'avance.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Le même mécanisme, non. new veut dire new, c'est un nouvel objet et pas un objet existant. Il n'est pas correct d'utiliser new si ce qu'on veut n'est pas un nouvel objet.

    Il est par contre, parfaitement possible de créer une méthode statique qui te fournira l'objet que tu souhaites, sans forcément que cet objet soit un nouvel objet.
    Prenons l'exemple de Integer.valueOf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // deux variables de classe Integer, initialisées chacune de la même façon
    Integer a = Integer.valueOf(3);
    Integer b = Integer.valueOf(3);
     
    System.out.println(a == b); // affiche true. a et b pointent donc vers un seul et même objet. Integer.valueOf leur a fourni le même à chaque fois.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Je suis donc obligé de passer par une factory et de modifier un code existant s'il utilise naivement new.
    Merci thelvin !

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par shaiHulud Voir le message
    Je suis donc obligé de passer par une factory et de modifier un code existant s'il utilise naivement new.
    Oui.
    Mais il est possible d'empêcher l'emploi de new pour éviter de s'en servir naïvement, et pour repérer le code qui le faisait (il ne compilera plus et sera donc très visible.)
    Il suffit de rendre les constructeurs private.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Oui, mais je peux vouloir continuer à instancier cette classe ailleurs.
    D'ailleurs, si la factory se branche sur un pool d'instances, la pool doit avoir accés au constructeur pour s'initialiser (?)

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu peux toujours rendre aussi le constructeur "default" (visibilité dans le package) et mettre ta fabrique/pool dans le même package : ainsi la classe ne peut être instancier en dehors du package et elle le peut depuis n'importe quel classe du package.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package fr.developpez.exemple;
     
    public class LaClasse {
     
          LaClasse() { // constructeur visibilité "package" 
          }
     
          // méthode d'instianciation libre si tu veux en avoir une
          public static LaClasse of() {
                return new LaClasse(); 
          }
     
    }
    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
    package fr.developpez.exemple;
     
    public class PoolFactory {
     
         ...
     
          public PoolFactory (...) { 
              ...
          }
     
         public static LaClasse of() {
               ...
               ... new LaClasse(); 
               ...
          }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Autre possibilité, la pool peut être chapeautée par la classe elle-même et donc, non, ne pas avoir besoin de la visibilité du constructeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Prenons l'exemple de Integer.valueOf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // deux variables de classe Integer, initialisées chacune de la même façon
    Integer a = Integer.valueOf(3);
    Integer b = Integer.valueOf(3);
     
    System.out.println(a == b); // affiche true. a et b pointent donc vers un seul et même objet. Integer.valueOf leur a fourni le même à chaque fois.
    Mais que se passe-t-il quand ce n'est plus 3 mais une valeur > que 127 ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Mais que se passe-t-il quand ce n'est plus 3 mais une valeur > que 127 ?
    La réponse est dans la documentation de public static Integer valueOf(int i):
    ... This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range.
    Ainsi, ceci retourne une valeur qui n'est pas certaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(a == b)

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Démontrant ainsi un comportement assez versatile et s'adaptant aux situations, qu'on peut implémenter avec une factory static method.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci à tous pour vos réponses

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/08/2015, 12h43
  2. Réponses: 24
    Dernier message: 23/05/2013, 08h26
  3. Réponses: 0
    Dernier message: 12/04/2011, 19h20
  4. probleme pour customisation d un gridview ?
    Par arioule dans le forum ASP.NET
    Réponses: 1
    Dernier message: 07/08/2007, 14h53
  5. [VB.Net] fonctions génériques pour le new
    Par ohcysp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/09/2006, 11h47

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