Re: How to create an object of a given class NAME?
"Miguel Farah" <miguel@farah.cl> wrote in message
news:1164918608.494658.51630@h54g2000cwb.googlegroups.com...
I got the following piece of code:
static private Idiom determineIdiom(Locale region) {
if (region==null) region=DEFAULT_REGION;
String language=region.getLanguage();
if (language==null) language=DEFAULT_LENGUAJE;
Idiom myIdiom=null;
if (language.equals("es")) { myIdiom=(Idiom)new
Idiom_es();
} else if (language.equals("en")) { myIdiom=(Idiom)new
Idiom_en();
} else if (language.equals("ca")) { myIdiom=(Idiom)new
Idiom_ca();
} else if (language.equals("fr")) { myIdiom=(Idiom)new
Idiom_fr();
} else {
myIdiom=(Idiom)new Idiom_es(); //default
}
return myIdiom;
}
All the Idiom_* classes extend Idiom, which in turn implements an
interface. If I want to add support for a new language (say, finnish),
I
have to write a Idiom_fi class AND I have to put a new if sentence in
this method:
} else if (language.equals("fi")) { myIdiom=(Idiom)new
Idiom_fi();
I'd like to get rid of the second requirement, and for that I'd need to
be able to
compose the name of the class I want to instance, sorta like this:
myIdiom=(Idiom)new {{"Idiom_"+language}}();
I'm not sure if this can be done in Java. Can it?
Thanks in advance.
You could use reflection to avoid using hard-coded class names. Then to
support a new language, you would need to write a new class, but plug it in
using a resource bundle to map the language to the class name, e.g.,
in a resource properties file (e.g.,
..../my/idiom/package/Resources.properties),
en_us=my.idiom.package.Idiom_en
de_de=my.idiom.package.Idiom_de
etc. Obviously, there are details, such as variants (e.g., en_us_cajun) that
you might have to deal with.
In your code, instead of a bunch of if statements, you would do something
like this (some details, such as exception handlers, omitted - treat this as
pseudo code):
ResourceBundle resources =
ResourceBundle.getBundle("my.idiom.package.Resources");
String idiomClassName = resources.getString(region.getLanguage());
Class idiomClass = Class.forName(idiomClassName);
Idiom myIdiom = (Idiom)idiomClass.newInstance();
return(myIdiom);
Reflection is a very good way to accomplish plug-ins.