Java, список типов классов - PullRequest
3 голосов
/ 25 февраля 2012

Я работаю над Java-приложением.Это абстрактный класс Model и 2 производных класса Model 1 и Model 2. Model1 и Model2 ведут себя по-разному, поэтому я хочу позволить пользователю выбрать модель из двух.Это может быть реализовано так:

Model model;
If(response==1){
    model = new Model1();
}else if(response==2){
    model = new Model2();
}

Теперь проблема в том, что если я добавлю новый класс Model3, мне придется переписать код.Я мог бы создать список, в который я бы добавил экземпляр из каждого класса, а затем добавил бы статический метод, который бы возвращал новый экземпляр класса, но я надеюсь, что это можно сделать с немного большим стилем.

Можно ли создать список для хранения типа каждого класса.Из этого списка я мог бы создать меню для выбора модели, а затем использовать тип для создания класса, в котором нуждается пользователь.Объект класса как конструктор, чтобы создать экземпляр данного класса?

Ответы [ 3 ]

4 голосов
/ 25 февраля 2012

Вы можете создать список поставщиков :

static final List<Supplier<Model>> MODEL_MAKERS = ImmutableList.of(
    new Supplier<Model>() { public Model get() { return new Model1(); } },
    new Supplier<Model>() { public Model get() { return new Model2(); } },
    new Supplier<Model>() { public Model get() { return new Model3(); } }
);

Вы можете обойтись без отражения, но это требует выхода за пределы обычных механизмов обработки исключений Java, требует нулевого аргумента public конструкторы и public классы, которые ограничивают то, как код может изменяться при обслуживании способами, которые не проверяются javac, и просто не нужны в этом случае.

1 голос
/ 25 февраля 2012

Если вы уверены, что у него будет открытый конструктор без аргументов, вы можете использовать Class.newInstance ()

Для более сложных задач вы можете найти объект Constructor с Class.getConstructor (s) и затем вызвать его таким образом.

Если у вас есть это, сравнительно легко вставить ваши Class в Map или что-то для поиска и создания экземпляров.

0 голосов
/ 25 февраля 2012

Да, вы можете использовать метод newInstance () в Class для его создания. У него должен быть конструктор без аргументов.

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