Быстро создать объект класса A Java - PullRequest
1 голос
/ 05 мая 2020

Итак, я работаю над небольшим (но все же утомительным) количеством классов, точным числом, 20, но это не имеет значения.

Одна из вещей, которые будет делать моя программа, это чтобы прочитать входные данные из 2 параметров (String className, String name) и добавить новый объект с именем класса className с параметром имени для его конструктора.

Итак, представьте себе собаку, кошку, свинью , Moth, Mouse, bla ... каждый из них принимает один и тот же конструктор, только разные классы. Вместо того, чтобы делать

if (className.equalsIgnoreCase("Dog")){
     myArrayList.add(new Dog(name));
} else if (className.equalsIgnoreCase("Cat")){
     myArrayList.add(new Cat(name));
} else if (...)

, есть способ сделать так, чтобы я мог просто выполнить

myArrayList.add(new X(name));

или что-то знакомое?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы также можете сделать что-то подобное. В этом примере нет Spring Framework, но с Spring Framework он может быть немного проще.

  1. Определить интерфейс для фабрик
    public interface AnimalFactory<T extends Animal> {
        boolean isFactoryForType(String type);
        Animal createWithName(String name);
    }
Завод орудий
    public class DogFactory implements AnimalFactory<Dog> {

        @Override
        public boolean isFactoryForType(String type) {
            return "dog".equalsIgnoreCase(type);
        }

        @Override
        public Dog createWithName(String name) {
            return new Dog(name);
        }
    }
    public class CatFactory implements AnimalFactory<Cat> {

        @Override
        public boolean isFactoryForType(String type) {
            return "cat".equalsIgnoreCase(type);
        }

        @Override
        public Cat createWithName(String name) {
            return new Cat(name);
        }

    }
Пример собаки
    public class Dog extends Animal {
        public Dog(String name) {
            super(name);
        }

        @Override
        public String toString() {
            return "This is a Dog with name: " + getName();
        }
    }
Пример использования
    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("Expect type AND name as input arguments");
            System.exit(1);
        }

        String type = args[0];
        String name = args[1];

        List<AnimalFactory<? extends Animal>> animalFactories = new ArrayList<>();
        animalFactories.add(new DogFactory());
        animalFactories.add(new CatFactory());

        AnimalFactory<?> animalFactory = animalFactories.stream()
                .filter(factory -> factory.isFactoryForType(type))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("Type " + type + " not supported"));

        Animal animal = animalFactory.createWithName(name);

        System.out.println("Created animal: " + animal);
    }
Вывод с аргументами: собака Борис

Created animal: This is a Dog with name: Boris

Вывод с аргументами: car Bill

Created animal: This is a Cat with name: Bill

0 голосов
/ 05 мая 2020

Если все классы находятся в одном пакете, вы можете использовать отражение:

Class<?> clazz = Class.forName("your.package." + className);
Constructor<?> constructor = clazz.getConstructor(String.class);
myArrayList.add((CommonParent) constructor.newInstance(name));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...