让某 method 明确声明: 我不接受 null 参数, 传了 null , 我马上崩溃 !
并且, 该抛错在编译阶段抛出, 不要跑到运行时去
欢迎选择我的课程,让我们一起见证您的进步~~
Java的型別系統不支持,只能透過插件實作: Checker Framework,要加入註解,在編譯時指定插件。
上面實作了編譯器偵測null了,至於傳了null就崩潰,能透過插件插入null check程式碼的方式實作。
好問題,平常只專注在怎麼實現功能,卻沒怎麼想過為什麼Java不這樣去實現,例如這個問題。也勾起了我許多天馬行空的想像,如果Java語法支援該多好啊,開發效率至少高幾倍吧,不過再想想好像有點不對勁吧。
假設Java支援這樣的語法,使用註解:@NotNull識別參數不為空
@NotNull
一個這樣場景:使用者登入成功後,更新使用者的登入時間和ip。
用戶資料有:
更新使用者資訊偽代碼:
public void updateAccount(@NotNull Account account) { // 因为肯定不为空,可以放心大胆的更新Account的最新登录时间、ip }
@NotNull表示参数:account表示參數: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。
service.updateAccount()
Accoount
null
是的,可以這樣,這就變成了一種模式叫空對象設計模式(NullObject Pattern) ,意思就是建立一個專用的空對象,以此來代表結果為空。
詳細請參閱:
https://segmentfault.com/q/10...
http://www.cnblogs.com/haodaw...
Java的型別系統不支持,只能透過插件實作: Checker Framework,要加入註解,在編譯時指定插件。
上面實作了編譯器偵測null了,至於傳了null就崩潰,能透過插件插入null check程式碼的方式實作。
好問題,平常只專注在怎麼實現功能,卻沒怎麼想過為什麼Java不這樣去實現,例如這個問題。也勾起了我許多天馬行空的想像,如果Java語法支援該多好啊,開發效率至少高幾倍吧,不過再想想好像有點不對勁吧。
NullPointerException是運行時異常是有一定道理的
假設Java支援這樣的語法,使用註解:
@NotNull
識別參數不為空一個這樣場景:使用者登入成功後,更新使用者的登入時間和ip。
用戶資料有:
更新使用者資訊偽代碼:
@NotNull
表示参数:account
表示參數:account
不能為空,這裡沒什麼問題。取得使用者資訊驗證登入偽代碼:
我們只是參數不能為空,並不讓回傳值不為空,這樣也沒什麼問題。
主邏輯判斷偽代碼:
那麼問題來了,account參數到底能不能傳入
service.updateAccount()
方法,编译能不能通过?从数据库中读取的Accoount
对象本来就是个模凌两可对象,有可能代表某个人,也有可能是null
。那就把回傳值也變成不為空的?
是的,可以這樣,這就變成了一種模式叫空對象設計模式(NullObject Pattern) ,意思就是建立一個專用的空對象,以此來代表結果為空。
詳細請參閱:
https://segmentfault.com/q/10...
http://www.cnblogs.com/haodaw...