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 :

Surcharge d'éléments statiques


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut Surcharge d'éléments statiques
    Bonjour,

    Je rencontre actuellement un problème de taille (qui risque de ne pas être spécifique au Java prochainement).
    Cela fait un certain temps que je développe un ORM en PHP composé de diverses classes (forcément) et vu que le système marche de mieux en mieux je souhaite le transposer en Java. Ceci dans le but de l'implanter à la fois côté serveur en J2EE et côté client comme j'essaye de le faire maintenant.

    J'en entends déjà certains beugler au dernier rang sur le côté laxiste de PHP mais je suis justement disposé à travailler avec plus de rigueur avec Java.
    N'hésitez donc pas à me dire ce qui ne va pas dans mes concepts, puisque ça viens surement de là.

    Basiquement, j'ai crée une classe de base qui contiens divers traitements sur les données chargées (les préparations de la lecture, de l'écriture et de la suppression).
    Cette classe peut-être étendue par d'autres classes (qui peuvent elles-mêmes être étendues et ainsi de suite).
    Jusque là elle sont toutes abstraites. Seule la classe en bout de chaine d'extension est instanciable.
    Pour accéder aux données, ces classes instanciables doivent disposer obligatoirement de deux éléments : une configuration (le nom de la table dans laquelle taper par exemple) et surtout un driver.
    Ce driver me donne la capacité de charger des données depuis une base SQL, depuis un fichier ou bien depuis tout ce qu'on veut. C'est donc dans le driver MySQL que se situent véritablement les requêtes SQL.
    Ce driver utilise donc la configuration de la classe de l'objet qu'il cherche à remplir pour accéder aux données.

    Pour moi, la configuration présente pour permettre l'accès aux données est un attribut de classe (et non d'objet), tout comme le driver (tous les objets instanciés passent par la même instance du driver, ca me semble plus léger au niveau mémoire).
    La configuration contenant non seulement le nom de la table SQL (par exemple) mais aussi des attributs propres à l'objet, ca ne saurait être un attribut du driver.

    En PHP il est possible de déclarer un attribut statique dans la classe mère et de renseigner sa valeur dans une sous-classe tout en permettant à la classe mère d'y accéder (c'est d'adaptation de contexte ou Late-Static Binding).
    C'est intéressant pour intégrer le driver dans mes classes d'objet.
    En Java ca ne semble pas possible. Ainsi, tout ce que j'ai mis en place tombe et du coup je suis très malheureux (forcément ).

    J'aimerai trouver une solution intermédiaire entre mon modèle "PHP" un peu extrémiste avec toutes ces valeurs statiques sans forcément tout déclarer en attribut d'objet (je ne veux pas avoir 1000 instances du même driver pour 1000 objets de données).

    Un exemple concret à cela serait (c'est faux mais c'est pour l'exemple) :
    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
    20
    21
    22
     
    // Classe mère
    public abstract class Mere {
      protected static String toto = "toto"; // C'est un String mais ça pourrait etre un objet Driver ou autre.
     
      public static show(){
        System.out.println(toto);
      }
    }
     
    public class Fille1 extends Mere {
      protected static String toto = "tata";
    }
     
    public class Fille2 extends Mere {
      protected static String toto = "titi";
    }
     
    // Test
    Mere.show(); // Doit afficher "toto" et c'est bien le cas.
    Fille1.show(); // Doit afficher "tata" mais affiche "toto".
    Fille2.show(); // Doit afficher "titi" mais affiche "toto".
    Si quelqu'un a des précisions à m'apporter je suis volontier preneur.

    Merci par avance et bonne journée.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Par défaut
    Tu dis ne pas vouloir plusieurs instances de Driver. Mais dans ton exemple, c'est ce que je vois ... Chaque classe a son propre driver ...
    Je dois avoir mal compris un truc ...

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Merci de ta réponse

    Oui, je me suis mal exprimé : Je désire avoir une instance de Driver par classe puisque tous les objets d'une même classe accèdent à la même "source de données".

    Il y aura bien plusieurs instance d'un Driver mais il n'y en a qu'une seule pour tous les objets d'une classe.

  4. #4
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Si la notion statique n'est pas importante, je te propose ceci:

    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
    20
    21
    22
    23
    24
    25
    26
     
    abstract class Mere {
    	private String driver = null;
     
    	Mere(String driver) {
    		this.driver = driver;
    	}
     
    	public void show() {
    		System.out.println(driver);
    	}
    }
     
    class Fille1 extends Mere {
     
    	Fille1() {
    		super("tata");
    	}
    }
     
    class Fille2 extends Mere {
     
    	Fille2() {
    		super("titi");
    	}
    }

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 106
    Par défaut
    A ce moment la, je ferais un truc comme ceci:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    public abstract class Mere
    {
        protected static String toto = "toto"; // C'est un String mais ça
     
        // pourrait etre un objet Driver
        // ou autre.
     
        public void show()
        {
            System.out.println(getToto());
        }
     
        public String getToto()
        {
            return toto;
        }
    }
     
    public class Fille1 extends Mere
    {
        protected static String toto = "tata";
     
        public String getToto()
        {
            return toto;
        }
    }
     
    public class Fille2 extends Mere
    {
        protected static String toto = "titi";
     
        public String getToto()
        {
            return toto;
        }
    }
     
    public class Fille3 extends Mere
    {
    }
     
    new Fille1().show(); // Doit afficher "tata"
    new Fille2().show(); // Doit afficher "titi"
    new Fille3().show(); // Doit afficher "toto"
     
    // Tu ne peux pas construire Mere. Mais nimporte quelle classe fille qui n'override pas la methode getToto(), recuperera le toto de la classe mere ;)

  6. #6
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Java ne permettant pas l'héritage multiple, il me semble in-approprié d'utiliser l'héritage pour transmettre l'instance du driver.

  7. #7
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Je ne vois pas d'héritage multiple dans la description de son problème.

  8. #8
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Excellent

    Pour ce que tu proposes billynirvana, le côté statique est essentiel : comment n'avoir qu'une instance de driver par classe si on n'a pas des attributs statiques?

    Je commence à y voir plus clair avec la dernière réponse de radtriste : il faudrait donc que je modifie mes méthodes de la classe mère (les traitements génériques) de sorte à ce qu'elle utilise des sortes "d'accesseurs" aux attributs statiques de chaque classe. C'est pas gênant.
    Le seul soucis est qu'il faut créer des objets "vides" (sans charger de données) si on veut uniquement accéder à l'instance du Driver d'une classe bien particulière sans charger de données non?

    A moins qu'il soit possible de faire quelque chose du genre :
    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
     
    // Classe Mere
    package ma.classe;
     
    public class Mere {
      protected Driver cls_drv;
     
      static {
        cls_drv = new Driver();
      }
     
      public Driver getDrv(){ // Non statique (pour qu'elle soit overridable).
        return cls_drv; // On accède à l'attribut statique de la classe.
      }
    }
     
    // test
    String ma_classe = "ma.classe.Mere";
    Driver drv = ma_classe.getDrv();
    Encore une fois c'est très faux mais c'est pour illustrer mon propos
    Il doit falloir faire de la réflexion avec la classe java.lang.Class pour que ça marche non?

    Citation Envoyé par william44290 Voir le message
    Oui pour le moment. Mais après ?
    Normalement je ne prévois pas d'en faire.
    Je sais que c'est un problème dans plusieurs langages donc j'évite de m'y frotter.

    Le Driver (et la configuration) est intimement lié à la classe et à la hiérarchie dans laquelle est s'inscrit. Il ne doit pas être apporté par une classe annexe à cette hiérarchie.

    Le cas le plus probable qui pourrait se présenter se trouve au niveau des traitements mis en place : deux comportements apportés par deux classes différentes.
    Mais on peut faire sans donc ca ira mais peut-être avais-tu une autre idée en tête?

    Merci pour votre aide en tous cas

  9. #9
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    C'est un problème d'architecture générale, je ne connais pas ton projet mais dans ma pratique je me suis déjà posé cette question et j'ai retenu une autre solution que celle que tu as envisagé.

    Concrètement dans mon projet j'ai des vues couplées avec des tables. Ces vues sont des JPanel que je plug dans un frame.

    Tu peux jetter un coup d'oeil sur mon projet. Si cela t'inspire.

  10. #10
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Oui mais Swing est propre à Java. Ce n'est pas pour moi.
    Je tiens pour l'instant à conserver l'ambivalence PHP/Java pour pouvoir me servir de ces classes sur des hébergements mutualisés.

    Citation Envoyé par fanfouer Voir le message
    Il doit falloir faire de la réflexion avec la classe java.lang.Class pour que ça marche non?
    J'arrive à avoir une instance de Class qui représente la classe visée avec ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class<?> maClasse  = Class.forName("ma.super.Classe");
    Mais ensuite peut-on accéder aux membres statiques avec cet objet sans passer par newInstance()?
    Ca me parait pas évident en raison de la nature compilée du langage...

Discussions similaires

  1. employer opérateurs sans éléments statiques ou amitié.
    Par UnConfiantEtudiant dans le forum Débuter
    Réponses: 4
    Dernier message: 02/07/2014, 09h44
  2. POO : surcharge de méthode statique
    Par Kropernic dans le forum VB.NET
    Réponses: 7
    Dernier message: 28/03/2014, 09h49
  3. Comment "surcharger" une fonction "statique" ?
    Par ZZZzzz2 dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2012, 17h39
  4. Impression d'éléments Statiques avec QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/12/2003, 18h49
  5. Réponses: 5
    Dernier message: 24/04/2003, 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