第52條:慎用重載

重載是實現(xiàn)多態(tài)非常重要的手段之一提针,但是在使用重載時,往往也容易出現(xiàn)預(yù)料之外的結(jié)果海雪,因此在使用重載,尤其是方法的重載時要尤其的謹(jǐn)慎舱殿。

使用方法重載可能帶來的問題

  • 方法的重載和繼承時的覆蓋不同
    繼承時的覆蓋機制是:選擇被覆蓋的方法的正確版本是在運行時進行的奥裸,選擇的依據(jù)是被調(diào)用方法所在對象的運行時類型。
    因此
class Wine {
    String name() { return "wine"; }
}
class SparklingWine extends Wine {
    @Override
    String name() { return "sparkling wine"; }
}
class Champagne extends SparklingWine {
    @Override
    String name() { return "champagne"; }
}
public class Overriding {
    public static void main(String[] args) {
        List<Wine> wineList = List.of(new Wine(), new SparklingWine(), new Champagne());
        for (Wine wine : wineList)
            System.out.println(wine.name());
    }
}

的輸出是:“wine沪袭,sparking wine 和 champagne”

二方法的重載機制則湾宙,要調(diào)用哪個方法是在編譯時做出決定的。如下面這段代碼

// Broken! - What does this program print?
public class CollectionClassifier {
    public static String classify(Set<?> s) {
        return "Set";
    }
    public static String classify(List<?> lst) {
        return "List";
    }
    public static String classify(Collection<?> c) {
        return "Unknown Collection";
    }
    public static void main(String[] args) {
        Collection<?>[] collections = {
            new HashSet<String>(),
            new ArrayList<BigInteger>(),
            new HashMap<String, String>().values()
        };
        for (Collection<?> c : collections)
            System.out.println(classify(c));
    }
}

最后只會輸出三次“Unknown Collection”冈绊。因為參數(shù)編譯時的類型都是Collection<?>.

  • Java5 引入自動裝箱之后侠鳄,重載尤其尤其需要謹(jǐn)慎
    如List 的remove(Integer e) 和remove(int i) 就是兩個完全不同的方法。前者是移除列表中的指定對象死宣,后者是移除列表中指定位置的對象伟恶。

  • lambda 和方法引用也可能引起方法重載的混亂
    因為lambda 和方法引用時的函數(shù)式方法本身也可能被重載,其返回結(jié)果可能會超出我們的預(yù)料毅该,與重載搭配使用可能出現(xiàn)混亂博秫。如下面這段代碼:

new Thread(System.out::println).start();
ExecutorService exec = Executors.newCachedThreadPool();
exec.submit(System.out::println);

submit 方式其實帶有一個Callable<T>的重載,盡管我們認(rèn)為println 方法沒有返回值眶掌,可是萬一println也被重載了挡育,那么結(jié)果就會超出我們的預(yù)料了。


解決方法

由此可見朴爬,使用方法重載很可能會出現(xiàn)預(yù)料之外的結(jié)果静盅,因此,非必要情況下盡量不要使用方法的重載寝殴≥锏可以避開的方式有:

  • 對于相同名稱的方法,使用不同數(shù)量的入?yún)?/li>
  • 入?yún)⑾嗤瑫r蚣常,更改方法名稱
  • 是在無法更改方法名稱的場景(構(gòu)造器)市咽,如果遇到入?yún)?shù)量相同時,考慮使用靜態(tài)工廠模式初始化類

思考

非必要不重載抵蚊。因為重載會降低代碼的可讀性施绎,讓程序員無法在編寫和閱讀代碼時就能快速準(zhǔn)確的判斷出到底調(diào)用的是哪個方法。由此可能產(chǎn)生錯誤贞绳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谷醉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冈闭,更是在濱河造成了極大的恐慌俱尼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萎攒,死亡現(xiàn)場離奇詭異遇八,居然都是意外死亡矛绘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門刃永,熙熙樓的掌柜王于貴愁眉苦臉地迎上來货矮,“玉大人,你說我怎么就攤上這事斯够∏裘担” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵读规,是天一觀的道長劫灶。 經(jīng)常有香客問我,道長掖桦,這世上最難降的妖魔是什么本昏? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮枪汪,結(jié)果婚禮上涌穆,老公的妹妹穿的比我還像新娘。我一直安慰自己雀久,他們只是感情好宿稀,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赖捌,像睡著了一般祝沸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上越庇,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天罩锐,我揣著相機與錄音,去河邊找鬼卤唉。 笑死涩惑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桑驱。 我是一名探鬼主播竭恬,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熬的!你這毒婦竟也來了痊硕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤押框,失蹤者是張志新(化名)和其女友劉穎岔绸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡亭螟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年挡鞍,在試婚紗的時候發(fā)現(xiàn)自己被綠了骑歹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片预烙。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖道媚,靈堂內(nèi)的尸體忽然破棺而出扁掸,到底是詐尸還是另有隱情,我是刑警寧澤最域,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布谴分,位于F島的核電站,受9級特大地震影響镀脂,放射性物質(zhì)發(fā)生泄漏牺蹄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一薄翅、第九天 我趴在偏房一處隱蔽的房頂上張望沙兰。 院中可真熱鬧,春花似錦翘魄、人聲如沸鼎天。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋射。三九已至,卻和暖如春但荤,著一層夾襖步出監(jiān)牢的瞬間罗岖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工腹躁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呀闻,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓潜慎,卻偏偏與公主長得像捡多,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铐炫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容