以通用方式依赖于值返回对象

时间:2018-05-31 09:35:34

标签: java inheritance switch-statement generic-programming

考虑我有很多课程,所有课程都来自同一个课程

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中的函数指针一样?

2 个答案:

答案 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建议的功能映射。