Java 以通用方式根据值返回对象
假设我有许多类,都从同一个类继承:Java 以通用方式根据值返回对象,java,inheritance,switch-statement,generic-programming,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(v
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中的函数指针类似,您可以使用整数值到函数接口的映射,这些函数接口创建a
的各种子类的实例:
Map<Integer,Function<Object,A>> map = new HashMap<>();
map.put(0,f -> new AA(f));
map.put(1,f -> new AB(f));
...
在java中,C中也有类似的函数指针概念。 您可以使用Java反射(但效率不高): 您可以使用映射来保持“int-value”和“String-className”之间的关联。 但是这个解决方案并不有效!
相反,您可以使用Eran建议的函数图。您不会遇到具有类似于
if-else
的行为的零件,因为您必须决定返回哪种值
哪种类型的实例似乎很好!我需要更改代码中的一些内容,然后我将实现它并让您知道。谢谢:)建议您使用Function@Eran我有一个问题想。如果子类具有多个参数,该怎么办?@souki此解决方案目前仅支持一个参数。如果需要多个参数,可以使用映射
,让每个构造函数获取一个对象数组,但这会变得很难看。或者,如果所有的子类都使用多个参数,这些参数对所有子类来说都是相同的,那么您可以使用不同的函数接口而不是函数,来支持您需要的任意多的参数。好吧,是的,您是对的,这会变得很糟糕。希望它们都有相同的参数,所以使用不同的函数接口似乎适合我的需要。再次感谢您的建议!:)您检查了一些异常
异常,这些异常应该得到处理newInstance()
不带任何参数。
public A getChild(int value, Object foo) {
return map.getOrDefault(value, f -> new AA(f)).apply(foo);
}
public A getChild(String className, Object foo)
{
Class c = Class.forName(className);
return (A) c.newInstance(Object foo);
}