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 :

Instancier un générique


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 118
    Par défaut Instancier un générique
    Bonjour,

    Je souhaite définir une classe abstraite qui dérive de JComboBox, et laisser le type de données en generic.
    Car je souhaite définir une méthode utilitaire pour ajouter la possibilité d'insérer un item all/tout.
    Ce code est dupliqué dans toutes mes listes je souhaite le factoriser dans toutes mes implémentations

    Je dois donc instancier un objet, qi sera définis dans la classe enfant.
    Je voudrais savoir si il y a une syntaxe pour appeler un constructeur généric ?
    Ou dois-je choisir une autre voie ?

    Je suis en Java11

    Voici une idée de l'implémentation

    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
    public abstract class BComboBox<T> extends JComboBox {
    	protected boolean allOption;
     
     
    	public void addAllOption(boolean all) {
    //ou à la place du booléen on recherche si il y a un objet "all" dans la liste
    		if(!allOption) {
    //ici je voudrais instancier un type generic T
    			insertItemAt(new <T>.("ALL", "Tout"), 0);
    	}
    }
     
    public void removeAllOption() {
    //ou à la place du booléen on recherche si il y a un objet "all" dans la liste
    	if(allOption ) {
    removeItemAt(0);
    	}
    }
     
    private boolean isAllOptionActived( {
    ....
    }
    }
     
    public abstract class BComboBox<T> extends JComboBox {
    	protected boolean allOption;
     
     
    	public void addAllOption(boolean all) {
    		if(!allOption) {
    			insertItemAt(new <T>.("ALL", "Tout"), 0);
    	}
    }
     
    public void removeAllOption() {
    	if(allOption ) {
    removeItemAt(0);
    	}
    }
    }
    Cordialement
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    non ça n'existe pas, mais tu peux remplacer par la nécessité de fournir une fabrique de ton objet générique. Et donc chaque fois que tu veux créer un nouvel objet tu demandes à cette fabrique de t'en faire un :

    Ça ressemblerait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public abstract class BComboBox<T> extends JComboBox {
        private BiFunction<String, String, T> factory;
     
        public BComboBox(BiFunction<String, String, T> factory) {
            this.factory = factory;
        }
     
        public void addAllOption(boolean all) {
            if (!allOption) {
                insertItemAt(factory.apply("ALL", "Tout"),0);
            }
        }
    }
    Ensuite mettons que comme <T> tu veuilles utiliser un type comme celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    record StringPair(String first, String second) { }
    Pour en construire une instance avec "ALL" et "Tout" on se contente donc de faire new StringPair("ALL", "Tout") .

    Du coup la sous-classe ressemblerait à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class BComboBoxExample extends BComboBox<StringPair> {
        public BComboBoxExample() {
            super((s1, s2) -> new StringPair(s1, s2));
        }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 46
    Par défaut
    Je n'ai pas réussi à instancier le générique. Je comptais sur Class.forName() mais il faut le nom de la classe. Je n'ai pas trouvé de code qui fonctionne pour récupérer le nom de la classe générique.
    L'utilisation de Classe.forName est montréé à partir de la 21eme minute ici :



    Dans les autres voies, je trouve des solutions.
    Ma première remarque, c'est que je ne comprends pas pourquoi tu veux que ta classe BComboBox soit abstraite. A cause de cela, je dois inutilement l'utiliser en classe anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BComboBox<String> bc = new BComboBox<String>() {};
    Seconde remarque, Il est possible d'utiliser la composition plutôt que l'héritage. Cela conserver la possibilité d'hériter d'autre chose, et en plus, le complèteur de code n'est pas pollué par les méthodes de JComboBox quand on utilise BComboBox.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public abstract class CComboBox<T> {
    	private JComboBox<T> cb;
    	public CComboBox() {
    		super();
    		cb = new JComboBox<T>();
    	}
    }
    Pour la résolution du problème je trouve 3 possibilités :
    1) Fournir l'élément Tous à la méthode addAllOption

    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
     
    public abstract class BComboBox<T> extends JComboBox {
    	protected boolean allOption;
     
    	public void addAllOption(T all) {
    		if (!allOption) {
    			insertItemAt(all, 0);
    		}
    		allOption = true;
    	}
     
    	public void removeAllOption() {
    		if (allOption) {
    			removeItemAt(0);
    		}
    		allOption = false;
    	}
     
    	private boolean isAllOptionActived() {
    		return allOption;
    	}
     
    }

    2) Demander l'élément Tous au constructeur :

    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 B2ComboBox<T> extends JComboBox {
    	protected boolean allOption;
    	private T allOptionElement;
     
    	private T getAllOptionElement() {
    		return allOptionElement;
    	}
     
    	public B2ComboBox(T allOptionElement) {
    		super();
    		this.allOptionElement = allOptionElement;
    	}
     
    	public void addAllOption() {
    		if (!allOption) {
    			insertItemAt(getAllOptionElement(), 0);
    		}
    		allOption = true;
    	}
     
    .....
     
    }
    3) Demander l'élément Tous à la classe fille en passant par une méthode abstraite :

    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
     
    public abstract  class B3ComboBox<T> extends JComboBox {
    	protected boolean allOption;
     
    	public abstract T getAllOptionElement();
     
    	public void addAllOption() {
    		if (!allOption) {
    			insertItemAt(getAllOptionElement(), 0);
    		}
    		allOption = true;
    	}
     
    .....
     
    }


    Voici l'exemple d'utilisation :

    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
     
    public class test {
    	public static void main(String[] args) {
    		System.out.println("Début test");		
    		CComboBox<String> cc = new CComboBox<String>() {};
     
    		System.out.println("Version 1");
    		BComboBox<String> bc = new BComboBox<String>() {};
    		bc.addAllOption("Tous");
     
    		System.out.println("Version 2");
    		B2ComboBox<String> bc2 = new B2ComboBox<String>("Tous") ;
    		bc2.addAllOption();
     
    		System.out.println("Version 3");
    		B3ComboBox<String> bc3 = new B3ComboBox<String>() {
    			@Override
    			public String getAllOptionElement() {				
    				return "Tous";
    			}
    		};
    		bc3.addAllOption();
    		System.out.println("test terminé");
     
    	}
    }

  4. #4
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 118
    Par défaut
    Bonjour,

    Merci à vous deux.

    Pour mieux cerner mon besoin.

    Dans un premier temps j'ai fait mon paquage "Bog" Boite à outils graphiques.
    J'y ai regroupé tous mes objets swing et j'ai un peu factorisé

    J'ai dérivé plusieurs fois de JComboBox, pour créer des listes dédiées à mes objets métiers, que j'réutilise dans des composants surtout des JInternal frame

    Chaque liste est dédiées à un type d'objet métier.

    J'impose un constructeur avec un argument une interface avec une méthode pour accéder au DAO pour la remplir avec l'objet métier visé.

    Je me suis appperçu que parfois j'avais besoin d'un item de liste "tout".
    D'où mon idée de factoriser la méthode ajouter item tout....
    Car pour l'instant le code est dupliqué et ça ne plait pas beaucoup, car c'est pratiquement la même chose, car ça n'a pas été codé en même temps.

    Je pourrai envisager aussi d'ajouter cet item du type d'une classe "AllOption".
    Mais pour l'instant j'utilise la généricité pour limiter à un objet métier, et que java me colle un warning car une JComboBox attends cet argument

    Je peux faire aussi dériver mes objets métier d'un même type parents "MyBuisnessObject", je cherche encore un nom
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Moui mais c'est trop vague. Ce qu'il faut c'est du code, surtout la partie où il y a duplication/factorisation.

    On sait pas si ce dont on a parlé peut s'appliquer, ou si c'est une mauvaise approche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 118
    Par défaut
    Voici un exemple mais pour les autres c'est la même chose

    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
    public class BComboBoxJournaux<> extends JComboBox {
    	private static final long serialVersionUID = 1L;
     
    	private boolean allOption = false;
     
    	private XContextInterface xContext;
     
     
    	BComboBoxJournaux(XContextInterface xContext) {
    		super(xContext.getJournaux().toArray());
    		this.xContext = xContext;
     
    		setSelectedIndex(0);
    	}
     
    	public void addAllOption(boolean all) {
    		if(!allOption) {
    			insertItemAt(new Journal("ALL", "Tout"), 0);
    	}
    }
     
    public void removeAllOption() {
    	if(allOption ) {
    removeItemAt(0);
    	}
    }
     
    	public void setSelectedJournal(Journal journal) {
    		if (journal != null)
    			setSelectedItem(journal);
    	}
     
    	public void setSelectedJournal(String codeJournal) {
    			try {
    				setSelectedItem(xContext.getJournal(codeJournal));
    			} catch (XComptaObjetIntrouvableException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	}
    }
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/02/2013, 23h27
  2. Classes génériques - problème d'instanciation
    Par aigleborgne dans le forum C#
    Réponses: 2
    Dernier message: 26/03/2010, 15h58
  3. Réponses: 2
    Dernier message: 25/12/2008, 20h51
  4. Réponses: 3
    Dernier message: 12/06/2008, 16h05
  5. Instanciation de générique
    Par Mobius dans le forum Langage
    Réponses: 9
    Dernier message: 22/04/2008, 17h13

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