Создание экземпляра с идентификатором дочернего класса переменной (без instanceof case \ if-else-)

1

мой вопрос заключается в следующем: существует ли способ создать экземпляр, основанный на классе, который является частью 100 дочерних классов родительского класса. И у вас есть переменная, которая может быть 1 из этих 100 дочерних классов, но вы не знаете, какой из них. и вам нужно создать экземпляр этого класса. Но из-за большого количества дочерних классов было бы нецелесообразно обнаруживать вручную в случае, если оператор if if else может создать новый экземпляр на основе переменной, которая у вас такой:

object_2 = new (type of object_1)();

Или вы должны сделать это вручную?

Теги:

2 ответа

0
Лучший ответ

Вы можете использовать смесь Java Generics и reflection, чтобы получить то, что вы хотите. Вот пример одной потенциальной реализации с использованием ChildA и ChildB качестве подклассов Parent:

public class Test {

    public static void main(String... args) {
        new Test().test();
    }

    private void test() {
        Parent a = new ChildA();
        getNewInstance(a);

        Parent b = new ChildB();
        getNewInstance(b);
    }

    // T extends Parent makes sure we can only pass in subclasses of Parent
    static <T extends Parent> T getNewInstance(T oldInstance) {
        Class<T> theClass = (Class<T>) oldInstance.getClass();

        try {
            return theClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

class Parent {}

class ChildA extends Parent {
    public ChildA() { System.out.println("New ChildA created."); } 
}

class ChildB extends Parent {
    public ChildB() { System.out.println("New ChildB created."); }
}

И вывод, показывающий, что были созданы четыре отдельных дочерних объекта:

New ChildA created.
New ChildA created.
New ChildB created.
New ChildB created.

Стоит отметить, что это становится намного сложнее, если вам нужно вызвать параметризованные конструкторы.

Существует также ряд других способов сделать это, используя инструкции if-else или switch, но вы указали, что вам не нужно if-else, и я предположил, что это применимо и к переключению. Познакомьтесь с шаблоном проектирования Factory для получения дополнительных примеров.

0

Я думаю, вы можете сделать некоторые размышления...

РЕДАКТИРОВАТЬ:

Извините, я не могу проверить код сейчас, но это должно быть что-то вроде этого

ObjectParent cls = Class.forname(object1.getClass().getCanonicalName()).newInstance();

Добавление аргументов:

Чтобы дать аргументы конструктору, вам нужно получить конструктор этого объекта:

ObjectParent cls = object1.getClass().getConstructor(String.class).newInstance("string");

Здесь вы говорите: дайте мне конструктор, который имеет и строку как параметр, и вызовите его с помощью этой строки ("строка").

  • 0
    : / не похоже на работу. нет .getConstructor ().
  • 0
    отредактировано, я думаю, что теперь должно быть в порядке
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню