Currently I have a method that acts as a factory based on a given String.
For example:
public Animal createAnimal(String action)
{
if (action.equals("Meow"))
{
return new Cat();
}
else if (action.equals("Woof"))
{
return new Dog();
}
...
etc.
}
What I want to do is avoid the entire if-else issue when the list of classes grows.
I figure I need to have two methods, one that registers Strings to classes and another that returns the class based on the String of the action.
What’s a nice way to do this in Java?
What you’ve done is probably the best way to go about it, until a switch on string is available. (Edit 2019: A switch on string is available – use that.)
You could create factory objects and a map from strings to these. But this does get a tad verbose in current Java.
At the time this answer was originally written, the features intended for JDK7 could make the code look as below. As it turned out, lambdas appeared in Java SE 8 and, as far as I am aware, there are no plans for map literals. (Edited 2016)
Edit 2019: Currently this would look something like this.
If you want to add a parameter, you’ll need to switch
SuppliertoFactory(andgetbecomesapplywhich also makes no sense in the context). For two parametersBiFunction. More than two parameters, and you’re back to trying to make it readable again.