直接调用方法 vs 方法重载

Direct call of a method vs Method 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、性能、最佳实践等方面哪个选项更好?

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

我认为重载不会导致性能开销,因为 Java 知道要使用哪个函数。它在执行之前的编译时也知道这一点。当它知道在执行之前要做什么时,就不会有任何性能开销。

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

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

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

选项 2

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

没有性能差异 方法重载用于为用户提供替代方案。例如,如果您只提供一种方法来添加数字,用户将没有任何选择,即添加 3 个或更多数字。另一方面,方法重载提供了替代方案。 您可能只想为用户提供一种名为 "Add" 的方法,但您希望提供添加 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;
}

所以你可以说方法重载为用户提供了灵活性和替代方案。

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

重载是最佳做法,如果预期会频繁使用替代方法,则应该使用重载。但是,您不应为每种可能的边缘情况提供过载的替代方案,因为这会污染您的 API.