I'm trying to create(initiate) instance conditionally.
I have an interface and there are several classes which implement the interface. (eg interface named "itfc" and there class "classA", "classB", "classC"
when I get a string from outside, (eg "a") then I wanna make class of A
so, it can be written like this:
public class someClass {
itfc interface;
public someClass(String name) {
this.inteface = makeInstanceByName(name);
}
public makeInstanceByName(name) {
if (name == "A") { return new classA(); }
else if (name == "B") { return new classB(); }
...
else { return null; }
}
}
but I have lots of classes which implements the interface, and also this codes don't look good.
I've searched the enums, but I don't know how to apply it into my one.
Can you help me?
Try class.forName(String)
, eg something like
Class.forName("my.package.name.ClassPrefix" + name)
Also make sure you take care of proper exception handling.
Update: Here is a complete MCVE as a proof of concept which also shows you how to instantiate the class via reflection API. But in this case you need to make sure that each target class has a default (no-arguments) constructor.
package de.scrum_master.app;
public interface MyInterface {}
package de.scrum_master.app;
public class Foo implements MyInterface {}
package de.scrum_master.app;
public class Bar implements MyInterface {}
package de.scrum_master.app;
public class Zot implements MyInterface {}
package de.scrum_master.app;
public class UhOh /*implements MyInterface*/ {}
package de.scrum_master.app;
public class Application {
public static void main(String[] argv) throws Exception {
System.out.println(makeInstanceByName("Foo"));
System.out.println(makeInstanceByName("Bar"));
System.out.println(makeInstanceByName("Zot"));
System.out.println(makeInstanceByName("UhOh"));
}
public static MyInterface makeInstanceByName(String name) throws Exception {
return
(MyInterface) Class.forName("de.scrum_master.app." + name)
.getConstructor()
.newInstance();
}
}
Console log:
de.scrum_master.app.Foo@6d06d69c
de.scrum_master.app.Bar@7852e922
de.scrum_master.app.Zot@4e25154f
Exception in thread "main" java.lang.ClassCastException: de.scrum_master.app.UhOh cannot be cast to de.scrum_master.app.MyInterface
at de.scrum_master.app.Application.makeInstanceByName(Application.java:15)
at de.scrum_master.app.Application.main(Application.java:8)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.