Автоматически добавлять подкласс в список, когда он расширяет суперкласс - PullRequest
0 голосов
/ 20 июня 2020

Вот что я хотел бы сделать:

Допустим, я создал класс под названием Animal. Затем я создаю класс Dog, который расширяет Animal. Только сделав это, можно ли добавить Dog в список в третьем классе под названием AnimalManager? Это нормально, если мне нужно вызвать метод в классе Animal, но я хочу, чтобы экземпляр Dog создавался без жесткого кодирования экземпляра Dog. Кажется, это невозможно. Примечание: мне нужен только один экземпляр каждого класса.

Спасибо за любую помощь заранее.

Обновление:

Это лучшее описание моей проблемы. У него тоже есть решение. Мне удалось найти это с помощью твоего парня. Спасибо за помощь! Во время выполнения найти все классы в приложении Java, которые расширяют базовый класс

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Вы можете использовать Отражения .

Reflections reflections = new Reflections("cz.milanhlinak.animal");
Set<Class<? extends Animal>> animals = reflections.getSubTypesOf(Animal.class);

См. Мой пример репозитория https://github.com/milanhlinak/62481200, где я использую Отражения + Google Guice для внедрения зависимостей.

Используя Reflections, вы можете получить все подтипы вашего класса Animal и добавить их в Google Guice Multibinder. После этого вы можете куда-то их ввести ...

// cz.milanhlinak.Module.java
public class Module extends AbstractModule {

    @Override
    protected void configure() {

        Reflections reflections = new Reflections("cz.milanhlinak.animal");
        Set<Class<? extends Animal>> animals = reflections.getSubTypesOf(Animal.class);

        Multibinder<Animal> animalBinder = Multibinder.newSetBinder(binder(), Animal.class);
        animals.forEach(animal -> animalBinder.addBinding().to(animal));

        bind(AnimalProvider.class).to(AnimalProviderImpl.class).in(Singleton.class);
    }
}

// cz.milanhlinak.animal.Animal.java
public abstract class Animal {

    private final String sound;

    public Animal(String sound) {
        this.sound = sound;
    }

    void makeSound() {
        System.out.println(this.sound);
    }
}

// cz.milanhlinak.animal.Dog.java
public class Dog extends Animal {

    public Dog() {
        super("Bark");
    }
}

// cz.milanhlinak.animal.Cat.java
public class Cat extends Animal {

    public Cat() {
        super("Meow");
    }
}

// cz.milanhlinak.animal.AnimalProvider.java
public interface AnimalProvider {

    Set<Animal> getAnimals();
}

// cz.milanhlinak.animal.AnimalProviderImpl.java
public class AnimalProviderImpl implements AnimalProvider {

    private final Set<Animal> animals;

    @Inject
    public AnimalProviderImpl(Set<Animal> animals) {
        this.animals = animals;
    }

    @Override
    public Set<Animal> getAnimals() {
        return this.animals;
    }
}

Вы также можете проверить Google Guice - как автоматически добавлять привязку там, где я искал что-то подобное, но на основе кастомных аннотации.

0 голосов
/ 20 июня 2020

Итак, вы хотите добавить экземпляр extends Animal в список в AnimalManager, верно?

Создайте метод publi c в AnimalManager, который получает объект Animal в качестве аргумента и добавляет его в свой список .

что-то вроде: "publi c void addToList (Animal obj)"

И вызовите его в конструкторе Animal. Благодаря этому все, что расширяет Animal, будет добавлено в AnimalList, если вы вызовете конструктор super.

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