Java:更快的重载或if/else

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)因为编译时类型xObject,没有String.x引用的对象的执行时类型String并不意味着foo(String)调用它.


osc*_*kuo 5

重载解决方案更快(更好),因为它在编译时解析.

基本上,编译器会确定在向其传递值时要调用的方法.当你调用getObject("abc")时,编译器将发出对方法的调用:

BaseObject getObject(String s)
{
     return new StringObject(s);
}
Run Code Online (Sandbox Code Playgroud)

而不是试图通过你的if ... else状态并在运行时评估对象类型(这是一个缓慢的活动).