【问题标题】:How can i create instance conditionally(by string) in Java?如何在 Java 中有条件地(按字符串)创建实例?
【发布时间】:2020-04-26 09:15:47
【问题描述】:

我正在尝试有条件地创建(启动)实例。

我有一个接口,并且有几个实现该接口的类。 (例如,名为“itfc”的接口和类“classA”、“classB”、“classC”

当我从外面得到一个字符串时,(例如“a”)然后我想创建一个 A 类

所以,可以这样写:

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; }
    }

}

但是我有很多实现接口的类,而且这些代码看起来也不好。

我已经搜索了枚举,但我不知道如何将它应用到我的枚举中。

你能帮帮我吗?

【问题讨论】:

  • interface 是保留关键字 - 将您的东西称为其他名称。 itfc 也应该是一种类型吗?如果是这样,为什么不使用正确的 Java 大小写约定?感觉好像你在这里误解了如何声明变量类型和命名。
  • 对不起,这只是一个错误。问题是,有一个类似(public interface Itfc { ~ })的接口,我将这个接口声明为“Itfc itfc”。我的坏
  • 开始使用正确的 java 约定:和接口,就像一个类一样,以大写字母开头,并且因为其他人(包括未来你的)需要能够阅读该代码,所以把它拼出来。 “ltfc”什么都不是,它不是一个词,也不是一个描述,等等。写一个合适的接口名称,然后声明一个该类型的字段。并且在帖子中更新您的代码以实际显示您正在使用的相关代码,不要将其精简到出现语法错误的程度。
  • 好的,谢谢。我是编程新手,尤其是java,而且英语不是我的第一语言,所以我不习惯你提到的东西。我会在以后的问题中写得更好。再次感谢

标签: java interface


【解决方案1】:

试试class.forName(String),例如像

Class.forName("my.package.name.ClassPrefix" + name)

还要确保注意正确的异常处理。


更新:这是一个完整的 MCVE 作为概念证明,它还向您展示了如何通过反射 API 实例化类。但在这种情况下,您需要确保每个目标类都有一个默认(无参数)构造函数。

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();
  }
}

控制台日志:

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)

【讨论】:

  • 更新:我在解决方案中添加了一个接口和一个负测试用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2017-03-15
  • 1970-01-01
  • 2022-06-28
  • 2014-03-22
  • 2013-02-02
相关资源
最近更新 更多