简体   繁体   中英

How can i create instance conditionally(by string) in Java?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM