java - overloading中文 - 我為什麼要重載方法?




overloading java (4)

我想如果你談論功能/方法重載的真正好處,沒有它你就無法解決問題,那麼正如你在問題中指出的那樣,你將找不到任何東西。

但它有什麼用呢? 讓我們考慮這個例子。

假設我正在創建一個通過他的名字找到一個人的應用程序,並聲明並定義一個方法

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)

我在我的重載方法書中找到了兩個例子,但它沒有清楚地解釋為什麼它有用:

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;
    }
}

這非常簡單,但老實說,這裡的方法重載似乎沒用,而且它似乎只是為了做到這一點。

本書中的下一個示例實現了方法重載,這似乎更有用,因為該程序計算英尺到厘米,有一種方法可以放入英尺和英寸,還有一種方法可以放英寸。 但是,為此製作兩個單獨的方法似乎同樣容易。

話雖如此,這樣做有什麼好處嗎? (我讀過this ,但我並不滿意。製作新方法似乎同樣容易。)


我是一個對象,我有能力,功能是固定的,但可以接受各種參數。

如果該功能可以接受1000種參數,您是否想要考慮1000個功能名稱?

把其他人發布作為一個很好的超載實踐,並採取JNIEnv做的一個不好的做法,因為C不支持重載。

CallStaticObjectMethod,
CallStaticObjectMethodV,
CallStaticObjectMethodA,
CallStaticBooleanMethod,
CallStaticBooleanMethodV,
CallStaticBooleanMethodA,
CallStaticByteMethod,
CallStaticByteMethodV,
CallStaticByteMethodA,
CallStaticCharMethod,
CallStaticCharMethodV,
CallStaticCharMethodA,
CallStaticShortMethod,
CallStaticShortMethodV,
CallStaticShortMethodA,
CallStaticIntMethod,
CallStaticIntMethodV,
CallStaticIntMethodA,
CallStaticLongMethod,
CallStaticLongMethodV,
CallStaticLongMethodA,
CallStaticFloatMethod,
CallStaticFloatMethodV,
CallStaticFloatMethodA,
CallStaticDoubleMethod,
CallStaticDoubleMethodV,
CallStaticDoubleMethodA,
CallStaticVoidMethod,
CallStaticVoidMethodV,
CallStaticVoidMethodA,

Reger to JNI獲取更詳細的結構定義


當您使用不同類型的值創建相同的方法時,重載非常有用。

Math類提供了一個完美的例子 - 它有類型的函數重載組 - 四個abs ,四個min ,四個max等等:

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) ,這會對用戶代碼的可讀性產生不利影響。


簡單而簡潔:重載只是Java提供的一種可能性(但大多數現代和靈活的語言都使用它) (以及其他語言,如C ++或C#),允許開發人員創建相同的方法/函數名稱,其中幾個它。

為什麼?
因為方法命名很重要,方法命名應該傳達它的行為。 因此,如果兩個方法具有相同的行為(例如轉換為字符串),而不是一個使用long作為輸入而另一個使用int作為輸入,為什麼具有不同的方法名稱?

    String myString = String.valueOf(new Integer(1));
    String myOtherString = String.valueOf(new Long(2));


意圖和目標是相同的,只是輸入參數改變。

當重載有意義時,您應該使用它而不是創建一些變體笨拙的名稱。





overloading