В Java, как вызвать конструктор экземпляра создателя текущего класса? - PullRequest
1 голос
/ 11 октября 2010

У меня есть класс «A», объект «a» которого создает объект «b» класса «B». Теперь «b» запускает метод, который хочет создать новый экземпляр родительского элемента b (пожалуйста, не путайте его с наследованием) - класс, который создал «b», то есть «A», как здесь.

Возможно ли это как-то на Java? Или, может быть, какое-то дизайнерское предложение может сработать.

Спасибо!

Редактировать: Согласно предложениям, я добавляю свои требования к дизайну тоже. У меня есть класс «ExitController», который работает по-разному в зависимости от функции вызывающей стороны - например, если он вызывается UserX, он завершает программу, если он вызывается UserY, он выходит из системы и т. Д. Обычно я должен размещать метод ExitController в моем пользовательском интерфейсе, но есть некоторые ограничения, из-за которых я не могу. Кроме того, передача родительского объекта / имени класса кажется очень дорогой по сравнению с использованием, которое он предлагает.

Ответы [ 2 ]

5 голосов
/ 11 октября 2010

По сути, вам нужно передать самого родителя или родительский тип в конструктор B. Приведенный ниже пример иллюстрирует последний случай.

class A {
    B b;

    A() { 
        b = new B(getClass());
    }
}

class B {
    Class<?> parentClass;

    B(Class<?> parentClass) {
        this.parentClass = parentClass;
    }

    void createParent() throws Exception {
        Object o = parentClass.newInstance();
    }
}

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


Обновление Согласно вашему обновлению, создание экземпляров не имеет смысла. Вы можете просто проверить тип класса и обработать его соответственно. Вместо createParent() в приведенном выше примере выполните:

void exit() {
    if (parentClass == UserX.class) {
        // Terminate program.
    } else if (parentClass == UserY.class) {
        // Logoff user.
    }
}

Это, однако, безобразно. Вы действительно не можете добавить другой метод к интерфейсу User? В противном случае следующий вариант будет лучше (так называемый шаблон стратегии ):

interface User {
    void exit();
}

class ExitController {
    void exit(User user) {
        user.exit();
    }
}

class UserX implements User {
    public void exit() {
        // Terminate program.
    }
}

class UserY implements User {
    public void exit() {
        // Logoff user.
    }
}

Согласно вашему последнему утверждению:

Кроме того, передача родительского объекта / имени класса кажется очень дорогой по сравнению с использованием, которое он предлагает

Это не имеет смысла. Вы измерили это? Покажите нам результаты.

0 голосов
/ 11 октября 2010

Если я правильно понимаю ваш вопрос, я думаю, что класс B должен будет хранить ссылку на объект a или A.class. Это позволило бы b создать новый экземпляр A. Простейшим способом сделать это было бы, если бы конструктор B принял аргумент класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...