我正在尝试构建一个简单的API,其中我有一个接口AnimalService
,其实现类是LionImpl
,TigerImpl
,ElephantImpl
。
AnimalService
有getHome()
方法
我有一个属性文件,其中包含我正在使用的动物类型
喜欢,
animal=lion
因此,根据我使用的动物类型,当我调用我的API(getHome()
中的AnimalService
)时,应执行特定实现类的getHome()
方法。
我怎样才能做到这一点?
提前谢谢。
答案 0 :(得分:2)
您可以通过创建包含枚举的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
}
}
}
这是一个高级代码,未针对语法错误等进行测试。
答案 1 :(得分:2)
您正在描述Java polymorphism的工作原理。以下是与您的说明相对应的一些代码:
<强> 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/