为什么我应该重载方法?

2022-09-01 04:12:24

我在我的重载方法书中发现了两个例子,但它没有清楚地解释为什么它是有用的:

package keepo;
public class Main{
    public static void main(String [] args)
    {
        int newScore = calculateScore("Tim", 500);
        System.out.println("New Score is" + newScore);
        calculateScore(75);

    }
    public static int calculateScore(String playerName, int score){
        System.out.println("Player" + playerName +"Has score" + score);
        return score * 1000;
    }
    public static int calculateScore(int score){
        System.out.println("Unnamed player scored" + score + "points");
        return score * 1000;
    }
}

这很简单,但老实说,在这里方法重载似乎毫无用处,而且似乎只是为了这样做而这样做。

书中的下一个例子做了方法重载,这似乎更有用,因为该程序计算英尺到厘米,并且有一种方法可以输入英尺和英寸,还有一种方法可以输入英寸。但是,为此制作两个单独的方法似乎仍然很容易。

话虽如此,这样做有什么真正的好处吗?(我读了这篇文章,但我并不是很满意。制作新方法似乎同样容易。


答案 1

我认为,如果你谈论函数/方法重载的真正好处,没有它你将无法绕过,那么正如你在问题中指出的那样,你不会找到任何东西。

但它有什么帮助呢?让我们考虑这个例子。

假设我正在制作一个应用程序,该应用程序通过他的名字查找一个人,并且我声明并定义了一个方法

public Person[] findPerson(String name)

现在我们得到了一个要求,我们必须通过他的出生日期找到一个人,所以引入一个新的方法

public Person[] findPerson_byDOB(Date date)

让我们假设这种情况还在继续,并且我的应用程序中有很多方法。

public Person[] findPerson(String name)
public Person[] findPerson_byDOB(Date date)
public Person[] findPerson_byAddress(Address address)
public Person[] findPerson_bySSN(SSN ssn)
public Person[] findPerson_byDepartment(Department department)
public Person[] findPerson_byMobile(Mobile mobile)

这只是一部分;当我们被要求引入多个参数时,这可以继续,例如

public Person[] findPerson_byMobileAndAddress(Mobile mobile, Address address)
public Person[] findPerson_byAddressAndDepartment(Address address, Department department)
public Person[] findPerson_byDOBAndDepartment(DOB dob, Department, department)
public Person[] findPerson_byAddressAndDOB(Address address, DOB dob)

还有更多...

虽然这似乎有点夸张,但相信我,在制作实际的行业级应用程序时,我们可能会遇到这样一种情况,即我们得到了成百上千种这样的方法,最终我们需要所有这些方法的目录来说明它们的实际作用。

当我们必须使用它时,当我们必须找到所有这些方法的名称时,这实际上是一场噩梦。

但是,当所有参数都不同时,我们可以为函数指定相同的名称,并且它确实变得非常容易记住。

public Person[] findPerson(String name)
public Person[] findPerson(Date date)
public Person[] findPerson(Address address)
public Person[] findPerson(SSN ssn)
public Person[] findPerson(Department department)
public Person[] findPerson(Mobile mobile)
public Person[] findPerson(Mobile mobile, Address address)
public Person[] findPerson(Address address, Department department)
public Person[] findPerson(DOB dob, Department, department)
public Person[] findPerson(Address address, DOB dob)

现在,正如大卫在他的回答中指出的那样,我们都知道如何获得整数的值;也许我们在某个地方读过它。String

static String.valueOf(new Integer(1));

但是您知道还有多少方法以相同的名称重载吗?

static String.valueOf(boolean b)
static String.valueOf(char c)
static String.valueOf(char[] data)
static String.valueOf(double d)
static String.valueOf(float f)
static String.valueOf(int i)
static String.valueOf(long l)
static String.valueOf(Object obj)

好处是您不必全部记住它们。你甚至不必猜测,因为它自始至终都是同一个名字。


根据Namnodorel的建议进行编辑

考虑类的这种重载方法。PrintStream

void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)

如果我们必须写,想想可读性:

void println_emptyLine()
void println_boolean(boolean x)
void println_character(char x)
void println_characterArray(char[] x)
void println_double(double x)
void println_float(float x)
void println_integer(int x)
void println_long(long x)
void println_object(Object x)
void println_string(String x)

答案 2

当您使用不同类型的值创建执行相同操作的方法时,重载很有用。

数学课提供了一个完美的例子 - 它有按类型划分的函数重载组 - 四,四,四,依此类推:absminmax

int max(int a, int b) {...}
float max(float a, float b) {...}
long max(long a, long b) {...}
double max(double a, double b) {...}

没有重载的替代方法将迫使您将类型“编码”到方法的名称中,例如 这将不利于用户代码的可读性。Math.intMax(a, b)