Определение подкласса из множества подклассов Java

У меня есть интерфейс Tree и абстрактный класс RBTree который реализует этот интерфейс. У меня также есть несколько классов Tree1...Tree9 которые расширяют этот абстрактный класс.

Я написал тестовый модуль, где я хочу сделать что-то вроде этого:

public void testRandom(RBTree tree){
    for(int i = 0; i < 10; i++){
        rbTree = new Tree1(); //if the tree in the parameter was of instance Tree1
        rbTree = new Tree2(); //if the tree in the parameter was of instance Tree2
        //etc.

        /**
         * do something with rbTree
         */
    }
}

Можно ли сделать это без использования цепочки операторов if (или переключателя) с большим количеством instanceof()?

(примечание: я не могу ничего изменить в дизайне, я знаю, что он не совсем оптимален)

3 ответа

Решение

Ты можешь использовать tree.getClass().newInstance(),

Если вы хотите иметь более сложную логику, чем инстанцирование, вам потребуется либо подход instanceof, либо лучше - сделать каждый RBTree у подкласса есть метод, который выполняет эту логику (и делает этот метод абстрактным в RBTree)

Попробуй это:

rbTree = tree.class.newInstance();

Используя рефлексию, вы можете:

string name = tree.getClass().getName()
Class.forName(name).newInstance();

Проблема в том, что если у реальных реализаций есть разные методы и т. Д., Вы не сможете получить к ним доступ.

Другие вопросы по тегам