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

Java Discussion :

Problème de mutualisation des setters


Sujet :

Java

  1. #1
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut Problème de mutualisation des setters
    Bonjour,

    Je suis en présence de code que je cherche à simplifier (c'est un « test case »).

    J'ai les 2 classes suivantes A et B :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    public class A {
    	private String ma1;
    	private String ma2;
    	private String ma3;
    	private String m1;
    	private String m2;
    	private String m3;
     
    	public String getMa1() {
    		return ma1;
    	}
     
    	public void setMa1(String ma1) {
    		this.ma1 = ma1;
    	}
     
    	public String getMa2() {
    		return ma2;
    	}
     
    	public void setMa2(String ma2) {
    		this.ma2 = ma2;
    	}
     
    	public String getMa3() {
    		return ma3;
    	}
     
    	public void setMa3(String ma3) {
    		this.ma3 = ma3;
    	}
     
    	public String getM1() {
    		return m1;
    	}
     
    	public void setM1(String m1) {
    		this.m1 = m1;
    	}
     
    	public String getM2() {
    		return m2;
    	}
     
    	public void setM2(String m2) {
    		this.m2 = m2;
    	}
     
    	public String getM3() {
    		return m3;
    	}
     
    	public void setM3(String m3) {
    		this.m3 = m3;
    	}
     
    	@Override
    	public String toString() {
    		return "A [ma1=" + ma1 + ", ma2=" + ma2 + ", ma3=" + ma3 + ", m1=" + m1 + ", m2=" + m2 + ", m3=" + m3 + "]";
    	}
    }
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    public class B {
    	private String mb1;
    	private String mb2;
    	private String mb3;
    	private String m1;
    	private String m2;
    	private String m3;
     
    	public String getMb1() {
    		return mb1;
    	}
     
    	public void setMb1(String mb1) {
    		this.mb1 = mb1;
    	}
     
    	public String getMb2() {
    		return mb2;
    	}
     
    	public void setMb2(String mb2) {
    		this.mb2 = mb2;
    	}
     
    	public String getMb3() {
    		return mb3;
    	}
     
    	public void setMb3(String mb3) {
    		this.mb3 = mb3;
    	}
     
    	public String getM1() {
    		return m1;
    	}
     
    	public void setM1(String m1) {
    		this.m1 = m1;
    	}
     
    	public String getM2() {
    		return m2;
    	}
     
    	public void setM2(String m2) {
    		this.m2 = m2;
    	}
     
    	public String getM3() {
    		return m3;
    	}
     
    	public void setM3(String m3) {
    		this.m3 = m3;
    	}
     
    	@Override
    	public String toString() {
    		return "B [mb1=" + mb1 + ", mb2=" + mb2 + ", mb3=" + mb3 + ", m1=" + m1 + ", m2=" + m2 + ", m3=" + m3 + "]";
    	}
    }
    On remarquera que les 2 classes ont 3 membres ayant le même nom (m1, m2, m3).

    Et voici schématisé le programme principale :

    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
    public class App1 {
     
    	public static void main(String[] args) {
    		A a = new A();
    		a.setMa1("aaa111");
    		a.setMa2("aaa222");
    		a.setMa3("aaa333");
    		mapRow(a);
    		System.out.println("a: " + a.toString());
     
    		B b = new B();
    		b.setMb1("bbb111");
    		b.setMb2("bbb222");
    		b.setMb3("bbb333");
    		mapRow(b);
    		System.out.println("b: " + b.toString());
    	}
     
    	private static void mapRow(A obj) {
    		obj.setM1("ccc111");
    		obj.setM2("ccc222");
    		obj.setM3("ccc333");
    	}
     
    	private static void mapRow(B obj) {
    		obj.setM1("ccc111");
    		obj.setM2("ccc222");
    		obj.setM3("ccc333");
    	}
    }
    qui me retourne cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a: A [ma1=aaa111, ma2=aaa222, ma3=aaa333, m1=ccc111, m2=ccc222, m3=ccc333]
    b: B [mb1=bbb111, mb2=bbb222, mb3=bbb333, m1=ccc111, m2=ccc222, m3=ccc333]
    Le problème consiste à valoriser les membres (m1, m2, m3) par la même méthode en utilisant par exemple la généricité.
    Est-ce possible ?
    Par exemple comme ça (cela ne fonctionne pas bien sur !) :

    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
    public class App2 {
     
    	public static void main(String[] args) {
    		A a = new A();
    		a.setMa1("aaa111");
    		a.setMa2("aaa222");
    		a.setMa3("aaa333");
    		mapRow(a);
    		System.out.println("a: " + a.toString());
     
    		B b = new B();
    		b.setMb1("bbb111");
    		b.setMb2("bbb222");
    		b.setMb3("bbb333");
    		mapRow(b);
    		System.out.println("b: " + b.toString());
    	}
     
    	private static <T> void mapRow(T obj) {
    		obj.setM1("ccc111");
    		obj.setM2("ccc222");
    		obj.setM3("ccc333");
    	}
    }
    Quelqu'un peut-il m'aider svp ?
    Merci.

  2. #2
    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
    Ce n'est pas un problème de généricité, juste un problème d'héritage tout simple. Pour refactorer du code commun, on crée une classe parent commune.


    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
    public class M {
    	private String m1;
    	private String m2;
    	private String m3;
     
    	public String getM1() {
    		return m1;
    	}
     
    	public void setM1(String m1) {
    		this.m1 = m1;
    	}
     
    	public String getM2() {
    		return m2;
    	}
     
    	public void setM2(String m2) {
    		this.m2 = m2;
    	}
     
    	public String getM3() {
    		return m3;
    	}
     
    	public void setM3(String m3) {
    		this.m3 = m3;
    	}
     
    	@Override
    	public String toString() {
    		return "A [ma1=" + ma1 + ", ma2=" + ma2 + ", ma3=" + ma3 + "]";
    	}
    }
    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
    public class A extends M{
    	private String ma1;
    	private String ma2;
    	private String ma3;
     
    	public String getMa1() {
    		return ma1;
    	}
     
    	public void setMa1(String ma1) {
    		this.ma1 = ma1;
    	}
     
    	public String getMa2() {
    		return ma2;
    	}
     
    	public void setMa2(String ma2) {
    		this.ma2 = ma2;
    	}
     
    	public String getMa3() {
    		return ma3;
    	}
     
    	public void setMa3(String ma3) {
    		this.ma3 = ma3;
    	}
     
    	@Override
    	public String toString() {
    		return "A [ma1=" + ma1 + ", ma2=" + ma2 + ", ma3=" + ma3 + ", m1=" + getM1() + ", m2=" + getM2() + ", m3=" + getM3() + "]";
    	}
    }
    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
    public class B extends M{
    	private String mb1;
    	private String mb2;
    	private String mb3;
     
    	public String getMb1() {
    		return mb1;
    	}
     
    	public void setMb1(String mb1) {
    		this.mb1 = mb1;
    	}
     
    	public String getMb2() {
    		return mb2;
    	}
     
    	public void setMb2(String mb2) {
    		this.mb2 = mb2;
    	}
     
    	public String getMb3() {
    		return mb3;
    	}
     
    	public void setMb3(String mb3) {
    		this.mb3 = mb3;
    	}
     
    	@Override
    	public String toString() {
    		return "B [mb1=" + mb1 + ", mb2=" + mb2 + ", mb3=" + mb3 + ", m1=" + getM1() + ", m2=" + getM2() + ", m3=" + getM3() + "]";
    	}
    }
    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
    public class App2 {
     
    	public static void main(String[] args) {
    		A a = new A();
    		a.setMa1("aaa111");
    		a.setMa2("aaa222");
    		a.setMa3("aaa333");
    		mapRow(a);
    		System.out.println("a: " + a.toString());
     
    		B b = new B();
    		b.setMb1("bbb111");
    		b.setMb2("bbb222");
    		b.setMb3("bbb333");
    		mapRow(b);
    		System.out.println("b: " + b.toString());
    	}
     
    	private static void mapRow(M obj) {
    		obj.setM1("ccc111");
    		obj.setM2("ccc222");
    		obj.setM3("ccc333");
    	}
    }
    Quand ce n'est pas possible, on peut toujours faciliter l'usage de la classe en utilisant plutot un interface à la place d'une classe parent. Les getter restent alors multipliés, mais on peut les manipuler de manière générale.

  3. #3
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ce n'est pas un problème de généricité, juste un problème d'héritage tout simple. Pour refactorer du code commun, on crée une classe parent commune.
    Bonjour et merci pour ta réponse tchize_.

    Oui, si je pouvais modifier ces classes, je l'aurais fait comme ça. Mais ce n'est hélas pas possible pour des raisons techniques non exposées dans ce post.

    Toutefois, je souhaite vraiment mutualiser ces méthodes identiques.

    Citation Envoyé par tchize_ Voir le message
    Quand ce n'est pas possible, on peut toujours faciliter l'usage de la classe en utilisant plutot un interface à la place d'une classe parent. Les getter restent alors multipliés, mais on peut les manipuler de manière générale.
    Cela serait donc possible en utilisant des interfaces !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public interface Z {
    	public String getM1();
    	public void setM1(String m1);
    	public String getM2();
    	public void setM2(String m2);
    	public String getM3();
    	public void setM3(String m3);
    }
    Je ne vois pas comment ?

  4. #4
    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
    En ayant ta classe A et B implémentant cette interface

  5. #5
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    En ayant ta classe A et B implémentant cette interface
    Yes !

    Effectivement, ça fonctionne.

    Merci encore à toi tchize_.

    Je résume :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public interface Z {
    	public String getM1();
    	public void setM1(String m1);
    	public String getM2();
    	public void setM2(String m2);
    	public String getM3();
    	public void setM3(String m3);
    }
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    public class A implements Z {
    	private String ma1;
    	private String ma2;
    	private String ma3;
    	private String m1;
    	private String m2;
    	private String m3;
     
    	public String getMa1() {
    		return ma1;
    	}
     
    	public void setMa1(String ma1) {
    		this.ma1 = ma1;
    	}
     
    	public String getMa2() {
    		return ma2;
    	}
     
    	public void setMa2(String ma2) {
    		this.ma2 = ma2;
    	}
     
    	public String getMa3() {
    		return ma3;
    	}
     
    	public void setMa3(String ma3) {
    		this.ma3 = ma3;
    	}
     
    	public String getM1() {
    		return m1;
    	}
     
    	public void setM1(String m1) {
    		this.m1 = m1;
    	}
     
    	public String getM2() {
    		return m2;
    	}
     
    	public void setM2(String m2) {
    		this.m2 = m2;
    	}
     
    	public String getM3() {
    		return m3;
    	}
     
    	public void setM3(String m3) {
    		this.m3 = m3;
    	}
     
    	@Override
    	public String toString() {
    		return "A [ma1=" + ma1 + ", ma2=" + ma2 + ", ma3=" + ma3 + ", m1=" + m1 + ", m2=" + m2 + ", m3=" + m3 + "]";
    	}
    }
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    public class B implements Z {
    	private String mb1;
    	private String mb2;
    	private String mb3;
    	private String m1;
    	private String m2;
    	private String m3;
     
    	public String getMb1() {
    		return mb1;
    	}
     
    	public void setMb1(String mb1) {
    		this.mb1 = mb1;
    	}
     
    	public String getMb2() {
    		return mb2;
    	}
     
    	public void setMb2(String mb2) {
    		this.mb2 = mb2;
    	}
     
    	public String getMb3() {
    		return mb3;
    	}
     
    	public void setMb3(String mb3) {
    		this.mb3 = mb3;
    	}
     
    	public String getM1() {
    		return m1;
    	}
     
    	public void setM1(String m1) {
    		this.m1 = m1;
    	}
     
    	public String getM2() {
    		return m2;
    	}
     
    	public void setM2(String m2) {
    		this.m2 = m2;
    	}
     
    	public String getM3() {
    		return m3;
    	}
     
    	public void setM3(String m3) {
    		this.m3 = m3;
    	}
     
    	@Override
    	public String toString() {
    		return "B [mb1=" + mb1 + ", mb2=" + mb2 + ", mb3=" + mb3 + ", m1=" + m1 + ", m2=" + m2 + ", m3=" + m3 + "]";
    	}
    }
    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
    public class App3 {
     
    	public static void main(String[] args) {
    		A a = new A();
    		a.setMa1("aaa111");
    		a.setMa2("aaa222");
    		a.setMa3("aaa333");
    		mapRow(a);
    		System.out.println("a: " + a.toString());
     
    		B b = new B();
    		b.setMb1("bbb111");
    		b.setMb2("bbb222");
    		b.setMb3("bbb333");
    		mapRow(b);
    		System.out.println("b: " + b.toString());
    	}
     
    	private static void mapRow(Z obj) {
    		obj.setM1("ccc111");
    		obj.setM2("ccc222");
    		obj.setM3("ccc333");
    	}
    }

  6. #6
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Par curiosité, est-ce que cette solution correspond à un design pattern, de près ou de loin ?
    Merci.

  7. #7
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Pas de réponse ? Tant pis.

    En tout cas, merci

  8. #8
    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
    ben j'ai pas de réponse :p

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 615
    Points
    21 615
    Par défaut
    Je suis pas sûr que l'héritage soit vraiment un patron de conception.

    Plutôt la mécanique de base d'un langage de classes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. problème our passer des string dans tableau d'int
    Par Battosaiii dans le forum C++
    Réponses: 9
    Dernier message: 15/07/2004, 17h42
  2. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50
  3. Réponses: 4
    Dernier message: 23/07/2003, 13h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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