以通用方式根据值返回 object

Returning object depending on a value in a generic way

考虑到我有很多 class, 都继承自同一个 class :

public class A
{
  ...
}

public class AA extends A
{
  ...
}

public class AB extends A
{
  ...
}

public class AC extends A
{
  ...
}

然后在代码的其他部分,我想 return child class 之一,具体取决于发送到该函数的值,如下所示:

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种children。但我可以假设其中有 30 个,switch 语句会变得很大。

有没有什么方法可以使用 switch 语句之外的其他东西来做同样的事情,而且会更通用?像 C 中的函数指针?

您可以使用整数值到功能接口的映射来创建 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);
}

在java中有一个类似C中函数指针的概念。 您可以使用 Java 反射(但效率不高):

public A getChild(String className, Object foo)
{
   Class c = Class.forName(className);
   return (A) c.newInstance(Object foo);
}

并且您可以使用地图来保持 "int value" 和 "String className" 之间的关联。 但是这个解决方案效率不高! 相反,您可以按照 Eran 的建议使用函数映射。