jbu*_*jbu 4 java polymorphism optimization conditional overloading
我有儿童班,每个班级都有其他成员带来不同类型的价值.可能有LongObject,IntObject,StringObject等.
我将获得一个值,可以是long,int,string等,我必须分别创建一个LongObject,IntObject,StringObject等.
如下所示重载方法会更快(a),或者只使用如下所示的elseif(b)?
它可能不是一个明显的性能差异.可能是重载方法以与if/else类似的方式实现.我不知道.
我也可以听到你们中的一些人说要测试一下.当然,我应该.如果有人知道的话,我也想知道如何在引擎盖下处理这种类型的重载.
请让我知道你在想什么.
谢谢,jbu
一个)
BaseObject getObject(long l)
{
return new LongObject(l);
}
BaseObject getObject(int i)
{
return new IntObject(i);
}
BaseObject getObject(String s)
{
return new StringObject(s);
}
...
Run Code Online (Sandbox Code Playgroud)
b)
BaseObject getObject(Object x)
{
if(value is a long)
return new LongObject((Long)x);
else if(value is an int)
return new IntObject((Int)x);
else if(value is a String)
return new StringObject((String)x);
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:我想我没有完全添加所有细节,有些人抓住了它.对于这两种选择,我仍然需要获取一个对象/值,并从值确定它是什么类型.因此,我仍然需要使用if/else某种甚至使用重载方法.
Jon*_*eet 21
这里有一个巨大的差异:在编译时选择重载,而你的"if(值很长)"将是执行时测试.
如果您在编译时知道类型,我强烈建议您使用该信息.如果不这样做,那么重载选项无论如何都不可行.
编辑:评论建议我详细说明在编译时选择的重载.
编译器根据有关参数的编译时信息选择调用哪个方法签名.这与覆盖的方法不同,其中使用的方法实现由方法的实际目标的类型确定.
这是一个例子:
public class Test
{
public static void main(String[] args)
{
Object x = "I'm a string";
foo(x);
}
public static void foo(String x)
{
System.out.println("foo(String)");
}
public static void foo(Object x)
{
System.out.println("foo(Object)");
}
}
Run Code Online (Sandbox Code Playgroud)
这将打印foo(Object)
因为编译时类型x
是Object
,没有String
.x
引用的对象的执行时类型String
并不意味着foo(String)
调用它.
重载解决方案更快(更好),因为它在编译时解析.
基本上,编译器会确定在向其传递值时要调用的方法.当你调用getObject("abc")时,编译器将发出对方法的调用:
BaseObject getObject(String s)
{
return new StringObject(s);
}
Run Code Online (Sandbox Code Playgroud)
而不是试图通过你的if ... else状态并在运行时评估对象类型(这是一个缓慢的活动).