Salut,
non il n'existe pas de classe toute faite pour résoudre ton cas spécifique.
mais tu peux la faire assez facilement
si ta chaine en entrée est bien une liste de paramètres séparées par des virgules
tu peux la découper en élément par un split
1 2
| String s="jeep, jaune, diesel";
String[] elements=s.split(","); |
attention les espaces restent dans les elements
si tu es sur que tu n'auras jamais d'espaces dans tes éléments, tu peux faire
String[] elements=s.trim().split("[, ]+"
ensuite, tu peux considérer que tu obtiens une séquence, du type:
classe principale + paramètres
il te faut ensuite convertir les éléments en classe
soit tu utilises une Map qui va te permettre d'associer chaque élément avec une classe, comme dans cet exemple :
1 2 3 4
| Map<String,Class<?>> classMap=new HashMap<String,Class<?>>();
classMap.put("jeep",Jeep.class);
classMap.put("jaune",Jaune.class);
classMap.put("diesel",Diesel.class); |
et pour récupérer la classe en fonction de l'élément :
Class<?> elementClass=classMap.get(element);
(tu peux aussi faire 3 maps, une pour les voitures, une pour les couleurs, une pour les carburants)
l'autre moyen est de faire une méthode qui découvre la classe en utilisant son nom, ce qui permet assez facilement d'avoir des classes de voitures avec un nombre de paramètres qui s'adapte à ta chaine en entrée
par exemple, si tes classes sont dans un package fr.package
1 2 3
| public static Class<?> getClass(String element) throws ClassNotFoundException {
return Class.forName("fr.package."+Character.toUpperCase(element.charAt(0))+element.substring(1));
} |
donc maintenant tu peux instancier tes paramètres :
1 2 3 4 5 6
| Object[] parametres=new Object[elements.length-1];
Class<?>[] paramClasses=new Class<?>[elements.length-1];
for(int i=1; i<elements.length;i++) {
paramClasses[i]=getClass(elements[i]);
parametres[i]=paramClasses[i].newInstance();
} |
ensuite il te faut instancier ton objet principal avec tes paramètres : c'est un tout petit peu plus complexe : on va utiliser la réflexion
1 2 3
| Class<?> classPrincipale = getClass(elements[0]);
Constructor<?> constructor = classPrincipale.getConstructor(paramClasses);
objectPrincipal = constructor.newInstance(parametres); |
et voilà objectPrincipal sera une instance de l'objet qui correspond à ta chaine
bien sûr, je n'ai mis en place aucun traitement d'erreur, si la saisie est incorecte, s'il y a trop ou pas assez de paramètres etc... c'est une base de départ à enrichir
enfin une dernière chose : si tes paramètres sont des valeurs d'une liste finie, tu peux utiliser aussi les énumérations, comme par exemple :
1 2 3
| public enum Carburant {
diesel,essence,super98,hybrid,electrique
} |
dans ce cas obtenir la valeur de paramètre correspondant à un élément est beaucoup plus simple :
Carburant carburant = Carburant.valueOf(element);
Partager