Java 方法的直接调用与方法重载

Java 方法的直接调用与方法重载,java,performance,oop,overloading,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 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、性能、最佳实践等方面,哪个选项更好

  • 可能第一个选项比第二个快,因为后一个选项有更多的push/pops到激活记录堆栈,这会减慢程序的执行,但这真的很重要吗
  • 另一方面,第二种方法在OOP方面似乎更干净、更好

<> > >编辑:让我们考虑,<代码>方法(字符串ARG)< /C> >被称为1×000、000、000、000、甚至更多,在这种情况下不会有性能问题,因为它调用<代码>方法(字符串ARG、String [] PARAMMEND、String [] PARAMEVALL)内部?

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

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

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


编辑:我在这里看到了与接口分离原理的一些相似之处(如果我们把方法的头看作它的内容的某种接口)。< /P> < P> <强>选项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。

重载构造函数通常使用选项2……不会有任何性能差异。支持最具可读性、最重要的是更安全的解决方案。第一种方法将强制每个调用方记住它需要传递一个包含空字符串的元素数组作为参数。这远远不是显而易见的(顺便说一句,这是非常不自然的。为什么不传递一个空数组,或者更好的是,传递一个空列表)。关于“OOP”有什么更好的地方是完全可以讨论的,哪一个更快在很大程度上取决于JIT将做什么(特别是如果它被调用了100万次)。请看我的编辑。Java是按值传递的,这意味着JVM复制每个参数值并将这些副本提供给方法。因此,如果该方法被调用100万次,是的,肯定会有性能差异。不,Java对原语以外的任何东西都是按引用传递的;对于原语,这是它所表示的字节序列的副本,而对于包含对象引用的变量,这正是该引用,而不是对象的副本。引用是变量的值。因此,Java是按值传递的。请看一下我的编辑。请看一下我的编辑。看这个我希望它能回答你的问题