嗨,大家好,我是一條,
告訴大家一個好訊息,一條IT訪問量突破20w,達到申請博客專家的條件,感謝大家的支持,一潭訓創作更多的優質內容,

為了讓更多的人看到一條的分享,一條準備報名原力計劃,報名條件是粉絲數超過2000,
所以一條現在非常需要大家的關注,如果覺得一條寫的還可以,就點個關注再走吧!
等粉絲數達到2000時,一條給大家在微信準備一個抽獎,獎品暫定鍵盤和手環二選一,關注微信公眾號就可以參與,
最近在公司看組長寫的代碼,發現很少有用“!=null”做非空判斷的,再看我自己代碼,十行有六行不等于null,丑陋繁冗
...if (someobject != null) { someobject.doCalc();}...作為一名高級程式員已經優雅的替換掉了”!=null“,你還在等什么呢,和一條一塊看看吧
判空分類
1.null是無效有誤的
2.null 是一個有效有意義的回傳值
你可能還不明白這兩句話的意思,不要急,接下來將詳細討論這兩種情況
1.無效null
null就是一個不合理的引數,就應該明確地中斷程式,往外拋錯誤,這種情況常見于api方法,
例如你開發了一個介面,id是一個必選的引數,如果呼叫方沒傳這個引數給你,當然不行,你要感知到這個情況,告訴呼叫方“嘿,哥們,你傳個null給我做甚",
相對于判空陳述句,更好的檢查方式有兩個
- assert陳述句,你可以把錯誤原因放到assert的引數中,這樣不僅能保護你的程式不往下走,而且還能把錯誤原因回傳給呼叫方,豈不是一舉兩得,關于assert的詳細用法可以看這篇文章:assert的用法總結
- 直接拋出空指標例外,上面說了,此時null是個不合理的引數,有問題就是有問題,就應該大大方方往外拋,
2.有效null
這種情況下,null是個”看上去“合理的值,例如,我查詢資料庫,某個查詢條件下,就是沒有對應值,此時null算是表達了“空”的概念,
這里給一些實踐建議:
1、假如方法的回傳型別是collections,當回傳結果是空時,你可以回傳一個空的collections(empty list),而不要回傳null,
例如呼叫側拿到回傳后,可以直接 list.size()!=0,又無需擔心空指標問題,(什么?想呼叫這個方法時,不記得之前實作該方法有沒按照這個原則?所以說,代碼習慣很重要!如果你養成習慣,都是這樣寫代碼(回傳空collections而不回傳null),你呼叫自己寫的方法時,就能大膽地忽略判空)
2、回傳型別不是collections,又怎么辦呢?
那就回傳一個空物件(而非null物件),下面舉個“栗子”,假設有如下代碼
public interface Action {
void doSomething();}
public interface Parser {
Action findAction(String userInput);}
其中,Parse有一個介面FindAction,這個介面會依據用戶的輸入,找到并執行對應的動作,假如用戶輸入不對,可能就找不到對應的動作(Action),因此findAction就會回傳null,接下來action呼叫doSomething方法時,就會出現空指標,
解決這個問題的一個方式,就是使用Null Object pattern(空物件模式)
我們來改造一下
類定義如下,這樣定義findAction方法后,確保無論用戶輸入什么,都不會回傳null物件
public class MyParser implements Parser {
private static Action DO_NOTHING = new Action() {
public void doSomething() { /* do nothing */ }
};
public Action findAction(String userInput) {
// ...
if ( /* we can't find any actions */ ) {
return DO_NOTHING;
}
}}
對比下面兩份呼叫實體
1、冗余:每獲取一個物件,就判一次空
Parser parser = ParserFactory.getParser();
if (parser == null) {
// now what?
// this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
// do nothing} else {
action.doSomething();}
2、精簡
ParserFactory.getParser().findAction(someInput).doSomething();
因為無論什么情況,都不會回傳空物件,因此通過findAction拿到action后,可以放心地呼叫action的方法,
判空規范
1.equal
1、如果要用equal方法,請用object<不可能為空>.equal(object<可能為空>)),舉例:
使用
"bar".equals(foo)
而不是
foo.equals("bar")
2.Optional
Java8或者guava lib中,提供了Optional類,這是一個元素容器,通過它來封裝物件,可以減少判空,不過代碼量還是不少,想拿到里面的元素用get() 方法,
3、exception
如果你想回傳null,請挺下來想一想,這個地方是否更應該拋出一個例外
其實非空的判斷是不能完全避免的,但我們可以盡量的減少,養成一個好的代碼規范,每次多想一步,是拋例外還是修改回傳值,高級程式員也是這么鍛煉出來的,
祝大家都能成為高級程式員,從此沒bug,
我是一條,一個在互聯網摸爬滾打的程式員,
微信搜【一條IT】關注我,第一時間獲取文章推送,
道阻且長,行則將至,大家的 【點贊,收藏,關注】 就是一條創作的最大動力,我們下期見!
注:關于本篇博客有任何問題和建議,歡迎大家留言!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282580.html
標籤:其他
上一篇:《毛選》推薦
