guava爲編寫漂亮代碼提供了很大的便利,今天,我想向你展現下我是怎麼使用預判斷來避免沒必要要的if/throw 申明,使用選擇來提高代碼邏輯性。java
預判斷並非新東西,Apache Commons項目有相似的功能,可是並無瓜娃提供的解決方案簡潔,預判斷用來驗證方法的參數,狀態等等,當條件判斷結果是false,預判斷就會拋出預想的異常,預想的意味着如下情形,當檢查狀態的時候,你可使用Preconditions.checkState( 條件 ),若是條件判斷的結果是false,將會拋出非法狀態異常,一樣,另一種預判斷checkArgument會拋出非法參數異常,固然,使用預判斷你惟一須要明確的時候就是使用靜態導入,讓咱們來看一個例子。this
給出的是一個方法,接受list做爲參數,當這個方法被調用的時候,咱們須要檢查list是否是null和是否是空,通常的java解決方案以下所示:spa
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,我常常使用選擇.這避免了我代碼中的空指針異常而且顯得更合語法,上面這個例子結合選擇變成了以下所示:code
public void doSomething() { checkState( field.isPresent(), "Argument is not initialied" ); doSomethingMore(); }
最後,由你決定這個代碼是否是更好更簡潔,經過使用預判斷和選擇.從個人觀點來看,這麼寫更具備可讀性對象