天天看點

Preconditions的簡單學習

在日常開發中,我們經常會對方法的輸入參數做一些資料格式上的驗證,以便保證方法能夠按照正常流程執行下去。對于可預知的一些資料上的錯誤,我們一定要做事前檢測和判斷,來避免程式流程出錯,而不是完全通過錯誤處理來保證流程正确執行,畢竟錯誤處理是比較消耗資源的方式。在平常情況下我們對參數的判斷都需要自己來逐個寫方法判斷,代碼量不少并且複用性不高,比如總是用if .... else .... 這時,我們可以使用Preconditions的方法做一些基本驗證

<code>package</code> <code>com.hanchao.test;</code>

<code>import</code> <code>com.google.common.base.Preconditions;</code>

<code>/**</code>

<code> </code><code>* 簡化我們的參數驗證的測試</code>

<code> </code><code>* @author liweihan</code>

<code> </code><code>*</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>PreconditionsTest {</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>        </code> 

<code>        </code><code>//1.</code>

<code>        </code><code>try</code> <code>{</code>

<code>            </code><code>getPersonByPrecondition(</code><code>1</code><code>,</code><code>null</code><code>);</code>

<code>        </code><code>} </code><code>catch</code> <code>(Exception e) {</code>

<code>            </code><code>System.out.println(e.getMessage());</code>

<code>        </code><code>} </code>

<code>        </code><code>//2.</code>

<code>            </code><code>getPersonByPrecondition(</code><code>2</code><code>, </code><code>""</code><code>);</code>

<code>        </code><code>}</code>

<code>            </code><code>getPersonByPrecondition(-</code><code>2</code><code>, </code><code>"tom"</code><code>);</code>

<code>            </code><code>getPersonByPrecondition(</code><code>1</code><code>, </code><code>"tom3333333333333333333333"</code><code>);</code>

<code>        </code><code>getPersonByPrecondition(</code><code>2</code><code>, </code><code>"JERRY"</code><code>);</code>

<code>        </code><code>//3.</code>

<code>        </code><code>String name = </code><code>"name"</code><code>;</code><code>//null;</code>

<code>        </code><code>String str = Preconditions.checkNotNull(name);</code>

<code>        </code><code>System.out.println(str);</code>

<code>    </code><code>}</code>

<code>    </code><code>private</code> <code>static</code> <code>void</code> <code>getPersonByPrecondition(</code><code>int</code> <code>age, String name) {</code>

<code>        </code><code>//1.驗證是否為null</code>

<code>//      Preconditions.checkNotNull(name);</code>

<code>        </code><code>Preconditions.checkNotNull(name,</code><code>"name為null"</code><code>);</code>

<code>        </code><code>//2.驗證參數</code>

<code>        </code><code>Preconditions.checkArgument(name.length()&gt;</code><code>0</code><code>, </code><code>"name為''"</code><code>);</code>

<code>        </code><code>Preconditions.checkArgument(age&gt;</code><code>0</code><code>, </code><code>"age must &gt; 0"</code><code>);</code>

<code>        </code><code>Preconditions.checkArgument(age &gt; </code><code>0</code> <code>&amp;&amp; name.length() &lt;</code><code>10</code><code>,</code><code>"name too lang and  max length is "</code><code>,</code><code>10</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>"a person age:"</code> <code>+ age + </code><code>",neme:"</code> <code>+ name);</code>

<code>    </code> 

<code>}</code>

對一些方法的說明:

 Preconditions裡面的方法:

  1 .checkArgument(boolean) :

功能描述:檢查boolean是否為真。 用作方法中檢查參數

失敗時抛出的異常類型: IllegalArgumentException

  2.checkNotNull(T):     

功能描述:檢查value不為null, 直接傳回value;

失敗時抛出的異常類型:NullPointerException

 3.checkState(boolean):

功能描述:檢查對象的一些狀态,不依賴方法參數。 例如, Iterator可以用來next是否在remove之前被調用。

失敗時抛出的異常類型:IllegalStateException

 4.checkElementIndex(int index, int size):

功能描述:檢查index是否為在一個長度為size的list, string或array合法的範圍。 index的範圍區間是[0, size)(包含0不包含size)。無需直接傳入list, string或array, 隻需傳入大小。傳回index。   

失敗時抛出的異常類型:IndexOutOfBoundsException

5.checkPositionIndex(int index, int size):

功能描述:檢查位置index是否為在一個長度為size的list, string或array合法的範圍。 index的範圍區間是[0, size)(包含0不包含size)。無需直接傳入list, string或array, 隻需傳入大小。傳回index。

  6.checkPositionIndexes(int start, int end, int size):

功能描述:檢查[start, end)是一個長度為size的list, string或array合法的範圍子集。伴随着錯誤資訊。

舉例:

<code>import</code> <code>java.util.ArrayList;</code>

<code>import</code> <code>java.util.List;</code>

<code> </code><code>* 簡化我們的參數驗證的測試2</code>

<code>public</code> <code>class</code> <code>PreconditionsTest2 {</code>

<code>        </code><code>List&lt;Integer&gt; intList = </code><code>new</code> <code>ArrayList&lt;Integer&gt;();</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; </code><code>10</code><code>; i++) {</code>

<code>            </code><code>try</code> <code>{</code>

<code>                </code><code>checkState(intList,</code><code>9</code><code>);</code>

<code>                </code><code>intList.add(i);</code>

<code>            </code><code>} </code><code>catch</code> <code>(Exception e) {</code>

<code>                </code><code>System.out.println(e.getMessage());</code>

<code>            </code><code>}</code>

<code>            </code><code>checkPositionIndex(intList,</code><code>3</code><code>);</code>

<code>            </code><code>checkPositionIndex(intList,</code><code>13</code><code>);</code>

<code>            </code><code>checkPositionIndexes(intList,</code><code>3</code><code>,</code><code>7</code><code>);</code>

<code>            </code><code>checkPositionIndexes(intList,</code><code>3</code><code>,</code><code>17</code><code>);</code>

<code>            </code><code>checkPositionIndexes(intList,</code><code>13</code><code>,</code><code>17</code><code>);</code>

<code>        </code><code>//4.</code>

<code>            </code><code>checkElementIndex(intList,</code><code>6</code><code>);</code>

<code>            </code><code>checkElementIndex(intList,</code><code>16</code><code>);</code>

<code>    </code><code>//4.</code>

<code>    </code><code>private</code> <code>static</code> <code>void</code> <code>checkElementIndex(List&lt;Integer&gt; intList, </code><code>int</code> <code>index) </code><code>throws</code> <code>Exception{</code>

<code>        </code><code>Preconditions.checkElementIndex(index, intList.size(),</code><code>"index:"</code><code>+index+</code><code>"不在list中,list的size為:"</code><code>+intList.size());</code>

<code>    </code><code>//3.</code>

<code>    </code><code>private</code> <code>static</code> <code>void</code> <code>checkPositionIndexes(List&lt;Integer&gt; intList, </code><code>int</code> <code>start, </code><code>int</code> <code>end) </code><code>throws</code> <code>Exception{</code>

<code>        </code><code>Preconditions.checkPositionIndexes(start, end, intList.size());</code>

<code>    </code><code>//2.</code>

<code>    </code><code>private</code> <code>static</code> <code>void</code> <code>checkPositionIndex(List&lt;Integer&gt; intList, </code><code>int</code> <code>index) {</code>

<code>        </code><code>Preconditions.checkPositionIndex(index, intList.size(),</code><code>"index:"</code><code>+index+</code><code>"不在list中,list的size為:"</code><code>+intList.size());</code>

<code>    </code><code>//1.</code>

<code>    </code><code>private</code> <code>static</code> <code>void</code> <code>checkState(List&lt;Integer&gt; intList, </code><code>int</code> <code>index) {</code>

<code>        </code><code>//表達式為True時不抛出異常</code>

<code>        </code><code>Preconditions.checkState(intList.size()&lt;index,</code><code>"intList size 不能大于"</code><code>+index);</code>

<code></code>

     本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1708066,如需轉載請自行聯系原作者

繼續閱讀