Вызов определенных классов реализации интерфейса в Java

Я пытаюсь создать простой API, где у меня есть интерфейс AnimalService и его классы реализации LionImpl, TigerImpl, ElephantImpl,
AnimalService есть метод getHome(),
И у меня есть файл свойств, который содержит тип животного, которое я использую, как,

animal=lion

Итак, в зависимости от типа животного, которое я использую, когда я вызываю свой API (getHome() от AnimalService), конкретный класс реализации getHome() метод должен быть выполнен.

Как я могу этого достичь?

Заранее спасибо.

2 ответа

Вы описываете, как работает полиморфизм Java. Вот код, соответствующий вашему описанию:

AnimalService.java

public interface AnimalService {
    String getHome();
}

ElephantImpl.java

public class ElephantImpl implements AnimalService {
    public String getHome() {
        return "Elephant home";
    }
}

LionImpl.java

public class LionImpl implements AnimalService {
    public String getHome() {
        return "Lion home";
    }
}

TigerImpl.java

public class TigerImpl implements AnimalService {
    public String getHome() {
        return "Tiger home";
    }
}

PolyFun.java

public class PolyFun {
    public static void main(String[] args) {
        AnimalService animalService = null;

        // there are many ways to do this:
        String animal = "lion";
        if (animal.compareToIgnoreCase("lion")==0)
            animalService = new LionImpl();
        else if (animal.compareToIgnoreCase("tiger")==0)
            animalService = new TigerImpl();
        else if (animal.compareToIgnoreCase("elephant")==0)
            animalService = new ElephantImpl();

        assert animalService != null;
        System.out.println("Home=" + animalService.getHome());
    }
}

Для получения дополнительной информации см. https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/

Вы можете достичь этого, создав класс Factory, который содержит перечисление, например

public static AnimalServiceFactory(){

    public static AnimalService getInstance() { // you can choose to pass here the implmentation string or just do inside this class
        // read the properties file and get the implementation value e.g. lion
        final String result = // result from properties
        // get the implementation value from the enum
        return AnimalType.getImpl(result);
    }

    enum AnimalType {
        LION(new LionImpl()), TIGER(new TigerImpl()), etc, etc;

        AnimalService getImpl(String propertyValue) {
            // find the propertyValue and return the implementation
        }
    }
}

Это код высокого уровня, не проверенный на синтаксическую ошибку и т. Д.

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