以通用方式根据值返回 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 的建议使用函数映射。
考虑到我有很多 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 的建议使用函数映射。