convertir une chaîne d’entrée en une instance de nom d’object (= entrée)

J’ai beaucoup de classes et je veux que l’utilisateur tape un nom et il obtiendra l’instance du même nom d’un object spécifique (classe). Je le simplifie par ce code:

public class Animal {...} public class lion extends Animal{...} public class zebra extends Animal{...} // and so on for a lot of animals Ssortingng name = input from user Animal something = new Animal(instance of the input name) 

À la dernière ligne, je voulais en fait convertir le nom de la chaîne en instance d’un nom de classe. Y a-t-il un moyen de le faire? il y aura beaucoup d’animaux, donc je ne veux pas écrire beaucoup de cas comme: “si l’entrée est égale à lion” ou zèbre ou serpent ou …

Je veux que l’utilisateur tape un nom et il obtiendra une instance du même nom d’un object spécifique (classe).

Class.forName() est ce que vous recherchez, si je ne me trompe pas?

Retourne l’object Class associé à la classe ou à l’interface avec le nom de chaîne donné.

 Object obj = Class.forName(user_enterd_name).newInstance(); 

Je suggère ici de créer une classe Factory qui crée l’instance qui vous convient

Par exemple:

 public class AnimalFactory { public Animal getAnimal(Ssortingng input) { if(input.equals("lion")) { return new lion(); } else if(input.equals("zebra")) { return new zebra(); } } } 

Allez avec ça (il utilise la reflection):

 public static Animal createAnimal(Ssortingng name) { try { Ssortingng package = "your.pkg"; // assuming all classes resume in the same package Ssortingng fqn = package + "." + name; Class animalClass = Class.forName(fqn); return (Animal) animalClass.newInstance(); } catch (Exception e) { return null; // react to any exception here } } 

Cet extrait de code requirejs que toutes les sous-classes d’animaux aient un constructeur par défaut.

Techniquement, cela devrait fonctionner pour vous, c’est juste un extrait qui ne sait pas si cela fonctionne, si vous rencontrez des problèmes, ajoutez un commentaire et je le rendrai plus générique.

 Map classes = new HashMap<>(); classes.put("zebra", Zebra.class); classes.put("lion", Lion.class); classes.put("etc", Etc.class); Animal aClass = classes.get(animalName).newInstance(); 

Je suppose que ce que vous voulez demander, c’est que le nom d’entrée doit être un nom de classe, par exemple, si l’utilisateur entre lion, une instance de lion doit être créée. Si tel est le cas, vous devez utiliser la reflection Java. Par exemple, Class cls = Class.forName (inputUserName); Cela vous donnera la classe requirejse. Maintenant, créez l’instance pour la classe Object clsInstance = (Object) cls.newInstance ();

Je vous suggère de faire de Animal une classe abstraite et d’introduire une AnimalFactory qui vous créera les types requirejs (cette usine peut utiliser un commutateur). Vous pouvez également introduire un Enum AnimalTypes au lieu de votre représentation Ssortingng.

 public class AnimalFactory { public Animal create(AnimalType animal) { switch (animal) { case lion: return new lion(); break; case dog: return new dog(); break; default: break; } } } 

Vos “animaux” étendent tous la classe abstraite Animal .