亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在重載方法中將 null 作為參數傳遞?

在重載方法中將 null 作為參數傳遞?

哆啦的時光機 2023-03-09 14:09:09
它在 Java 中針對以下類型的問題提供了一種解決方案:具有一個參數不同的重載方法。如果將不同的參數作為 null 傳入怎么辦?class PersonFactory {    public static Person create(String firstname, String lastname, String age) {          return create(firstname, lastname, Integer.valueOf(age));    }    public static Person create(String firstname, String lastname, Integer age) {           Person p = new Person();           p.setFirstname(firstname);           p.setLastname(lastname);           p.setAge(age);           return p;    }}PersonFactory.get("John", "Doe", null); //ambigous mapping我以為可以在這里傳遞一個Optional.empty(),但是沒有定義類型,因此不能用于選擇正確的方法...
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

您需要轉換null為您想要的類型,以便編譯器可以解決歧義。

例如:

PersonFactory.get("John", "Doe", (String) null);

或者

PersonFactory.get("John", "Doe", (Integer) null);


查看完整回答
反對 回復 2023-03-09
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

如果您傳遞 literal ,這只是一個問題null。


考慮添加另一個僅包含 2 個參數的重載,以避免出現 a) 的調用站點問題null;b) marstran建議的消除歧義的空投:


public static Person create(String firstname, String lastname) {

  return create(firstname, lastname, (Integer) null);

  // Or (String), if that's the one you want to invoke.

}

null本身(或強制轉換)對代碼的讀者來說意義不大。


現有重載的另一種方法是定義一個常量:


public static final Integer MISSING_AGE = null;


// ...

Person.create(firstname, lastname, MISSING_AGE)

您可以為此常量選擇一個名稱,它可以準確傳達空參數值的語義:

  • 隱瞞年齡

  • 未知年齡

  • 零年齡

  • 默認年齡

  • 現在創建沒有年齡,但稍后會提供

  • ...

(類似地,應該命名上面建議的 2-argcreate方法以傳達不提供年齡的含義)。


盡管如此,如果沒有 String 重載,就不會出現此問題。為方便起見,我假設您有 String 重載:您不需要對 API 的調用者如此“友善”。

就目前而言,不清楚您會接受什么 String 值:您接受空格嗎?千位逗號分隔?十六進制?ETC。

讓調用者處理這些問題:如果您只接受一個Integer,那么他們就是必須弄清楚如何構造它的人。

這對他們來說可能更容易,因為他們比你更了解他們的數據,而且他們發現你的 API 更容易理解。這對您來說更容易,因為您需要維護的 API 面更小。


查看完整回答
反對 回復 2023-03-09
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號