考虑我有很多课程,所有课程都来自同一个课程:
public class A
{
...
}
public class AA extends A
{
...
}
public class AB extends A
{
...
}
public class AC extends A
{
...
}
然后在代码的其他部分,我想返回一个子类,具体取决于发送给该函数的值,如下所示:
public A getChild(int value, Object foo)
{
switch(value)
{
case 0: {
return new AA(foo);
}
case 1: {
return new AB(foo);
}
case 2: {
return new AC(foo);
}
default: {
return new AA(foo);
}
}
}
在这个例子中,我只有3种类型的孩子。但我可以让其中的30个说出来,switch
声明会变得很大。
有没有办法使用switch
语句和更通用的其他东西做同样的事情?像C中的函数指针一样?
答案 0 :(得分:1)
您可以使用整数值到功能接口的映射来创建A
的各个子类的实例:
Map<Integer,Function<Object,A>> map = new HashMap<>();
map.put(0,f -> new AA(f));
map.put(1,f -> new AB(f));
...
然后使用如下映射:
public A getChild(int value, Object foo) {
return map.getOrDefault(value, f -> new AA(f)).apply(foo);
}
答案 1 :(得分:1)
在java中,C语言中存在类似的函数指针概念。 您可以使用Java Reflection(但效率不高):
public A getChild(String className, Object foo)
{
Class c = Class.forName(className);
return (A) c.newInstance(Object foo);
}
您可以使用Map来保持“int value”和“String className”之间的关联。 但是这个解决方案效率不高! 相反,您可以使用Eran建议的功能映射。