直接调用方法与方法重载

时间:2016-07-02 21:08:33

标签: java performance oop overloading

我很想知道什么是更好的:方法重载或直接调用方法?

以下是直接方法调用的示例:

public class A {
    public void method(String arg, String[] paramNames, String[] paramValues) {
        // do something with arg taking into consideration paramNames and paramValues
    }
}

public class B {
    public void meth() {
         A a = new A();
         a.method("some string", new String[] {"paramName"}, new String[] {"paramValue"});
         a.method("some other string", new String[] {""}, new String[] {""});
    }
}

以下是方法重载的示例:

public class A {
    public void method(String arg, String[] paramNames, String[] paramValues) {
         // do something with arg taking into consideration paramNames and paramValues
    }

    public void method(String arg) {
        method(arg, new String[] {""}, new String[] {""});
    }
}

public class B {
    public void meth() {
        A a = new A();
        a.method("some string", new String[] {"paramName"}, new String[] {"paramValue"});
        a.method("some other string");
    }
}

问题是,哪个选项在OOP,性能,最佳实践等方面更好?

  • 可能第一个选项比第二个选项更快,因为后一个选项有更多推送/弹出激活记录堆栈,这将减慢程序执行速度,但这真的很重要吗? / LI>
  • 另一方面,对于OOP,第二种方法似乎更清洁,更好。

编辑:让我们考虑method(String arg)被称为1 000 000 000次甚至更多,在这种情况下不会出现性能问题,因为它在内部调用method(String arg, String[] paramNames, String[] paramValues)

5 个答案:

答案 0 :(得分:3)

选项2

选项1将花费更少的时间(可忽略不计)。 然而,重载更容易阅读,总体上更好的做法(测试等)

答案 1 :(得分:2)

正如其他答案中已经提到的,性能影响可以忽略不计。特别是如果经常调用重载方法,Java JIT编译器将内联方法调用,使两个调用完全相同。

如果期望经常使用替代方法,则应该使用重载是最佳实践。但是,您不应为每个可能的边缘情况提供重载的替代方案,因为这会污染您的API。

答案 2 :(得分:1)

由于Java知道要使用哪个函数,我认为由于过载会导致性能开销。并且在执行之前它也在编译时知道。当它在执行之前知道该做什么时,就不会有任何性能开销。

所以根本不应该有任何性能开销。 此外,函数重载是一个OOP概念。因此,使用函数重载更好 - >这基本上是OOP的本质。我会说使用函数重载! (y):)

答案 3 :(得分:1)

我总是会推荐第二种方法。如果需要,它很容易维护和重构。然而,不确定速度,在第一种情况下,method的实际代码很可能具有相当多的分支来为缺少一个或多个参数的情况提供逻辑。那些分支机构需要时间。

编辑:我在这里看到与接口隔离原则有一些相似之处(如果我们将方法的标题视为某种接口的内容)。

答案 4 :(得分:1)

没有性能差异方法重载用于为用户提供替代方案。例如,如果您只提供一种方法来添加数字,则用户将没有任何替代方法,即添加3个或更多数字。另一方面,方法重载提供了替代方案。 您可能只想为用户提供一个名为“添加”的方法,但您想提供添加2个数字或3个数字的选项,例如

public int add(int a, int b){
    return a+b;
}

public int add(int a, int b, int c){
    return a+b+c;
}

因此,您可以说方法重载为用户提供了灵活性和替代方案。