Как я могу создать экземпляр условно (по строке) в Java? - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь создать (инициировать) экземпляр по условию.

У меня есть интерфейс, и есть несколько классов, которые реализуют интерфейс. (например, интерфейс с именем "itf c" и там класс "classA", "classB", "class C"

, когда я получаю строку извне (например, "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; }
    }

}

, но у меня есть много классов, которые реализуют интерфейс, а также этот код выглядит не очень хорошо.

Я искал перечисления, но я не знаю, как применить это в моем.

Вы можете мне помочь?

1 Ответ

0 голосов
/ 27 апреля 2020

Попробуйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...