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 :

problème de conception


Sujet :

Langage Java

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut problème de conception
    Bonjour,

    J'ai besoin d'éclairage sur un souci de conception, je vous explique.
    J'ai écrit une application java qui utilise plusieurs classes. Ensuite j'ai écrit une autre application java qui reprend pas mal de code et de classes de la première.
    Du coup je me suis dit, c'est moche, faut factoriser tout ça !

    Mon idée était de créer un package commun aux 2 applis et de redéfinir que les méthodes qui diffèrent. Ensuite je fais un jar de ce package et je l'import dans mes applis finales.
    Dans mon package je vais trouver des classes "classiques" utilisées tel quelle et des classes abstraites dont certaines méthodes seront redéfinies dans chacune de mes 2 applis.

    La dessus je me retrouve confronté à 2 soucis.
    1- dans mon package, j'ai défini une classe abstraite A qui sera redéfinie en A1 et A2 dans chacune de mes applis.
    Toujours dans mon package, j'ai aussi une autre classe B qui utilise des objets de type A et donc j'ai écrit : A obj = new A();
    Sauf qu'il n'est pas d'accord car A est abstraite et donc on ne peut pas l'instancier tant qu'on n'a pas redéfini toutes les méthodes abstraites. Comment je peux faire ?

    2- j'ai des classes internes dans des classes abstraites. Et je voudrai que celles ci soient aussi abstraites car le comportement de certaines méthodes va changer. Comment on peut faire ça ?

    Merci de vos éclaircissements.
    Jérôme

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    En premier lieu, si tu réalise un package "common", celui-ci doit être viable seul.

    1- dans mon package, j'ai défini une classe abstraite A qui sera redéfinie en A1 et A2 dans chacune de mes applis.
    Toujours dans mon package, j'ai aussi une autre classe B qui utilise des objets de type A et donc j'ai écrit : A obj = new A();
    Sauf qu'il n'est pas d'accord car A est abstraite et donc on ne peut pas l'instancier tant qu'on n'a pas redéfini toutes les méthodes abstraites. Comment je peux faire ?
    Il y a plusieurs solutions.
    Elles consistent toutes à ne pas demander à B de faire l'instanciation.

    Si on suppose ton package common avec les classes suivantes;

    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
    package org.k.developpez.forum.makecommon;
     
    public abstract class A {
     
    }
    package org.k.developpez.forum.makecommon;
     
    public class B {
     
    	private A a;
     
    	public A getA() {
    		return a;
    	}
     
    	public void setA(A a) {
    		this.a = a;
    	}
     
    }
    Si on veux faire une instanciation de B avec a non nulle. Il y a plusieurs possibilité :
    Passer en paramètre l’instance A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public B(A a){
        this.a=a;
    }
    Utilise le pattern Factory pour obtenir une instance de A (et de B).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package org.k.developpez.forum.makecommon;
     
    public class DummyA extends A {
     
    }
    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
    49
    50
    51
    52
     
    package org.k.developpez.forum.makecommon;
     
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
     
    public class Factory {
    	private Class implA;
     
    	public B buildB() {
    		B b = new B();
    		A a = buildA();
    		b.setA(a);
    		return b;
    	}
     
    	/**
             * Version pas propre et rapide utilisant l'API reflect pour instancier A.
             * @return
             */
    	public A buildA() {
    		A toReturn = null;
    		Constructor[] ctors = this.implA.getConstructors();
    		Constructor ctorWithOutParam = null;
    		for (int i = 0; i < ctors.length; i++) {
    			Constructor ctor = ctors[i];
    			if (ctor.getGenericParameterTypes().length == 0) {
    				ctorWithOutParam = ctor;
    				break;
    			}
    		}
    		try {
    			toReturn = (A) ctorWithOutParam.newInstance();
    		} catch (InstantiationException | IllegalAccessException
    				| IllegalArgumentException | InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return toReturn;
    	}
     
    	public void setImplementationA(Class impl) {
    		this.implA = impl;
    	}
     
    	public static void main(String[] args) {
    		Factory f = new Factory();
    		f.setImplementationA(DummyA.class);
    		B b = f.buildB();
    		System.out.println(b.getA());
    	}
    }
    Tu n'es pas obligé d'utiliser l'API reflect pour faire le job. Tu peux fournir à ta factory un fournisseur de A qui respecte interface qui donne des A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    interface AProducer {
     public A productA();
    }
    Sachant qu'il est préférable que ton package "common" ai déjà un producteur par défaut et une implémentation par défaut. Cela facilite l'utilisation de ta librairie.

    Note : Ma factory n'est qu'un exemple rapide. Il est préférable que tu regarde une présentation plus structuré. Il y a un tutoriel sur cela ici :

    http://gfx.developpez.com/tutoriel/c...tern/fabrique/

    2- j'ai des classes internes dans des classes abstraites. Et je voudrai que celles ci soient aussi abstraites car le comportement de certaines méthodes va changer. Comment on peut faire ça ?
    Ne fait pas de classe interne. Car cela veux dire que ta classe dépends de l'instance pour laquelle elle est crée. Ce qui est très rarement le cas. Et cela peut-être traiter par une simple relation 1-1.

    Cordialement,
    Patrick Kolodziejczyk.

    source :

    Creating New Class Instance
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par jejeman Voir le message
    1- dans mon package, j'ai défini une classe abstraite A qui sera redéfinie en A1 et A2 dans chacune de mes applis.
    Toujours dans mon package, j'ai aussi une autre classe B qui utilise des objets de type A et donc j'ai écrit : A obj = new A();
    Sauf qu'il n'est pas d'accord car A est abstraite et donc on ne peut pas l'instancier tant qu'on n'a pas redéfini toutes les méthodes abstraites. Comment je peux faire ?
    C'est difficile de dire sans voir dans quel contexte c'est utilisé.
    A priori, j'aurai tendance à dire qu'il faudrait que tu définisse une méthode abstraite (utilisation du principe du polymorphisme)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected abstract A getInstance();
    et tu utilises cette méthode pour remplacer tous les endroits où tu as des new A(), puisque cette instanciation dépendra des classes filles.
    Après, ça me parait bizarre dans la classe A de faire un new A()... Possible, mais étrange.

    2- j'ai des classes internes dans des classes abstraites. Et je voudrai que celles ci soient aussi abstraites car le comportement de certaines méthodes va changer. Comment on peut faire ça ?
    Les classes internes sont souvent liées au fonctionnement interne de la classe et n'ont pas pour but d'être étendues vu qu'elles n'existent que pour servir la classe dans laquelle elles se trouvent. C'est non extensible presque par définition !

    La encore, il va falloir s'orienter vers la déclaration de méthode abstraites qui seront implémentées dans les classes filles (quitte à déclarer des classes interne ou faire autrement)
    Je ne suis pas mort, j'ai du travail !

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

Discussions similaires

  1. Méthode Finalize et problème de conception
    Par phryos dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 12h04
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 23h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 19h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 14h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/05/2004, 00h13

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