在日常開發中,我們經常會對方法的輸入參數做一些資料格式上的驗證,以便保證方法能夠按照正常流程執行下去。對于可預知的一些資料上的錯誤,我們一定要做事前檢測和判斷,來避免程式流程出錯,而不是完全通過錯誤處理來保證流程正确執行,畢竟錯誤處理是比較消耗資源的方式。在平常情況下我們對參數的判斷都需要自己來逐個寫方法判斷,代碼量不少并且複用性不高,比如總是用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()></code><code>0</code><code>, </code><code>"name為''"</code><code>);</code>
<code> </code><code>Preconditions.checkArgument(age></code><code>0</code><code>, </code><code>"age must > 0"</code><code>);</code>
<code> </code><code>Preconditions.checkArgument(age > </code><code>0</code> <code>&& name.length() <</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<Integer> intList = </code><code>new</code> <code>ArrayList<Integer>();</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < </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<Integer> 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<Integer> 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<Integer> 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<Integer> intList, </code><code>int</code> <code>index) {</code>
<code> </code><code>//表達式為True時不抛出異常</code>
<code> </code><code>Preconditions.checkState(intList.size()<index,</code><code>"intList size 不能大于"</code><code>+index);</code>
<code></code>
本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1708066,如需轉載請自行聯系原作者