1,本文翻譯自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code-with-guava-optionals-and-preconditions/,有說的不對的地方,歡迎斧正。
2,我開發軟件的時候,朝着干凈代碼發展是我的特權,有一段時間,我曾在我幾乎所有的項目中使用谷歌瓜娃(Google Guava),理由很簡單,guava為我編寫漂亮代碼提供了很大的便利,今天,我想向你展示下我是怎么使用預判斷來避免不必要的if/throw 申明,使用選擇來提升代碼邏輯性。
預判斷並不是新東西,Apache Commons項目有類似的功能,但是並沒有瓜娃提供的解決方案簡潔,預判斷用來驗證方法的參數,狀態等等,當條件判斷結果是false,預判斷就會拋出預想的異常,預想的意味着以下情形,當檢查狀態的時候,你可以使用Preconditions.checkState( 條件 ),如果條件判斷的結果是false,將會拋出非法狀態異常,同樣,另外一種預判斷checkArgument會拋出非法參數異常,當然,使用預判斷你唯一需要明確的時候就是使用靜態導入,讓我們來看一個例子。
給出的是一個方法,接受list作為參數,當這個方法被調用的時候,我們需要檢查list是不是null和是不是空,一般的java解決方案如下所示:
public void doSomething( List<Object> list ) { if( list == null ) { throw new IllegalArgumentException( "List must not be null" ); } if( list.isEmpty() ) { throw new IllegalArgumentException( "List must not be empty" ); } doSomethingMore( list ); } |
當使用guava的預判斷,代碼的數量明顯減少,解決方案如下所示.
public void doSomething( List<Object> list ) { checkArgument( list != null, "List must not be null" ); checkArgument( !list.isEmpty(), "List must not be empty" ); doSomethingMore( list ); } |
這肯定是一個提升,但是,當這個方法結合瓜娃的選擇變得真正的性感,選擇是一個概念,被設計來避免病態的null概念(閱讀這里理解我為神馬叫她“病態”),這里明顯有一個對象容器來避免空引用,例如,null 大部分時間用來檢查一個對象是不是存在,如果不存在,一個空指針異常發生了,結果如以下代碼所示:
public void doSomething() { if( this.field == null ) { throw new IllegalStateException( "Field is not initialized" ); } doSomethingMore(); } |
與其保存這個對象直接放到field,我經常使用選擇.這避免了我代碼中的空指針異常並且顯得更合語法,上面這個例子結合選擇變成了如下所示:
public void doSomething() { checkState( field.isPresent(), "Argument is not initialied" ); doSomethingMore(); } |
最后,由你決定這個代碼是不是更好更簡潔,通過使用預判斷和選擇.從我的觀點來看,這么寫更具有可讀性,我期待在評論中聽到你的觀點 .