Java 中, 是否有方法, 强制某 method 不接受 null 类型参数 ?
天蓬老师
天蓬老师 2017-04-18 10:34:33
0
2
478

让某 method 明确声明: 我不接受 null 参数, 传了 null , 我马上崩溃 !

并且, 该抛错在编译阶段抛出, 不要跑到运行时去

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(2)
PHPzhong

Java的型別系統不支持,只能透過插件實作: Checker Framework,要加入註解,在編譯時指定插件。

上面實作了編譯器偵測null了,至於傳了null就崩潰,能透過插件插入null check程式碼的方式實作。

巴扎黑

好問題,平常只專注在怎麼實現功能,卻沒怎麼想過為什麼Java不這樣去實現,例如這個問題。也勾起了我許多天馬行空的想像,如果Java語法支援該多好啊,開發效率至少高幾倍吧,不過再想想好像有點不對勁吧。

NullPointerException是運行時異常是有一定道理的

假設Java支援這樣的語法,使用註解:@NotNull識別參數不為空

一個這樣場景:使用者登入成功後,更新使用者的登入時間和ip。

用戶資料有:

name password lasttime ip
aaa 123456 2017-01-09 192.168.1.1
bbb 123456 2017-01-08 192.168.1.1

更新使用者資訊偽代碼:

public void updateAccount(@NotNull Account account) {
    // 因为肯定不为空,可以放心大胆的更新Account的最新登录时间、ip
}

@NotNull表示参数:account表示參數:account不能為空,這裡沒什麼問題。

取得使用者資訊驗證登入偽代碼:

public Account login(String name) {
    // 1、连接数据库
    // 2、根据用户名获取Account
    // 3、验证用户信息
    // 4、验证成功返回Account信息,验证失败返回null
}

我們只是參數不能為空​​,並不讓回傳值不為空,這樣也沒什麼問題。

主邏輯判斷偽代碼:

public static void main(String[] args) {
    AccountService service = new AccountService();
    // aaa登录
    Account account = service.login("aaa","123456");
    service.updateAccount(account);
    
    // bbb登录
    Account account = service.login("bbb","123456");
    service.updateAccount(account);
    
    // ccc登录
    Account account = service.login("ccc","123456");
    service.updateAccount(account);
}

那麼問題來了,account參數到底能不能傳入service.updateAccount()方法,编译能不能通过?从数据库中读取的Accoount对象本来就是个模凌两可对象,有可能代表某个人,也有可能是null

那就把回傳值也變成不為空的?

是的,可以這樣,這就變成了一種模式叫空對象設計模式(NullObject Pattern) ,意思就是建立一個專用的空對象,以此來代表結果為空。

詳細請參閱:

  • https://segmentfault.com/q/10...

  • http://www.cnblogs.com/haodaw...

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板