能夠簡潔的完成參數檢驗,在進行業務邏輯代碼前進行前置判斷。而且避免了冗長的if語句。guava將全部檢驗的API都放置於Preconditions類中。前端
Preconditions類大體分爲6種提供參數檢驗的方法,每種方法都有三個重載方法。重載方法的參數意義是:express
方法聲明(不包括額外參數) | 描述 | 檢查失敗時拋出的異常 |
---|---|---|
checkArgument(boolean) | 檢查boolean是否爲true,用來檢查傳遞給方法的參數。 | IllegalArgumentException |
checkNotNull(T) | 檢查value是否爲null,該方法直接返回value,所以能夠內嵌使用checkNotNull。。 | NullPointerException |
checkState(boolean) | 用來檢查對象的某些狀態。 | IllegalStateException |
checkElementIndex(int index, int size) | 檢查index做爲索引值對某個列表、字符串或數組是否有效。index>=0 && index<size *。 | IndexOutOfBoundsException |
checkPositionIndex(int index, int size) | 檢查index做爲位置值對某個列表、字符串或數組是否有效。index>=0 && index<=size *。 | IndexOutOfBoundsException |
checkPositionIndexes(int start, int end, int size) | 檢查[start, end]表示的位置範圍對某個列表、字符串或數組是否有效* | IndexOutOfBoundsException |
如:咱們在作登陸操做的方法中,在未用前置條件前,代碼可能會以下:數組
1 public User login(String userName,String password){ 2 if(StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)){ 3 throw new RuntimeException("用戶名或密碼不能爲空"); 4 } 5 User user = userService.queryUserByUserNameAndPassword(userName,password); 6 if(null == user){ 7 throw new RuntimeException("用戶名或密碼錯誤"); 8 } 9 //…………………………………………省略業務邏輯………………………………………… 10 }
當使用了Preconditions類後app
public User login(String userName,String password){ Preconditions.checkArgument(!(StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)),"用戶名或密碼不能爲空"); User user = userService.queryUserByUserNameAndPassword(userName,password); Preconditions.checkNotNull(user,"用戶名或密碼錯誤"); //…………………………………………省略業務邏輯………………………………………… }
相信你們也發現了,Preconditions類與Assert斷言類的思想基本是一致的,經過這個思想,咱們也能夠實現屬於本身的斷言類從而提高本身的開發效率。spa
假設一個場景,咱們是基於接口開發工做的,接口經過JSON傳遞數據給前端。此時咱們先定義一個JSON的結構。code
public class ResponseEntity<T> implements Entity<T>,Serializable{ private static final long serialVersionUID = 1L; //數據實體 private T data; //結果碼 private Integer code; //錯誤描述 private String message; //………… }
自定義一個異常類orm
public class GlobException extends RuntimeException{ private static final long serialVersionUID = 1L; private String message; private Integer code; }
定義本身的前置條件類(斷言類)對象
/** * 斷言類 * @author cjl */ public abstract class Assert { /** * 斷言對象不爲空,若對象爲空則報異常 * @param obj 待校驗對象 * @param message 異常信息 */ public static void notNull(Object obj,String message){ if(obj == null) throw new GlobException(message); } /** * 斷言對象不爲空,若對象爲空則報異常 * @param obj 待校驗對象 */ public static void notNull(Object obj){ Assert.notNull(obj, "The Object can't null"); } /** * 斷言數字不能爲零,若數字爲零則報異常 * @param num 待校驗數字 * @param message 異常信息 */ public static void notZero(Integer num,String message){ Assert.notNull(num); if(num.intValue() == 0) throw new GlobException(message); } /** * 斷言數字不能爲零,若數字爲零則報異常 * @param num 待校驗數字 */ public static void notZero(Integer num){ Assert.notZero(num,"The number can't equals zero"); } /** * 斷言字符串不能爲空,若字符串爲空則報異常 * @param string 待校驗字符串 * @param message 異常信息 */ public static void notEmpty(String string,String message){ if(StringUtils.isEmpty(string)) throw new GlobException(message); } /** * 斷言字符串不能爲空,若字符串爲空則報異常 * @param string 待校驗字符串 */ public static void notEmpty(String string){ Assert.notEmpty(string,"The string can't empty"); } /** * 斷言該布爾值爲true,若爲false則拋異常 * @param expression 待校驗布爾值 * @param message 異常信息 */ public static void isTrue(boolean expression,String message){ if(!expression) throw new GlobException(message); } /** * 斷言該布爾值爲true,若爲false則拋異常 * @param expression 待校驗布爾值 */ public static void isTrue(boolean expression){ Assert.isTrue(expression,"The expression not true"); } }
這時候在定義一個全局異常處理類,這裏使用的是Spring Mvc的@ControllerAdvice註解blog
** * 全局異常處理 * @author cjl */ @ControllerAdvice public class ExceptionHandlers { @SuppressWarnings("rawtypes") @ResponseBody @ExceptionHandler(GlobException.class) public ResponseEntity<?> exceptionHandler(GlobException exception){ outException(exception); return new ResponseEntity(exception); } /** * 異常輸出 * @param exception */ private void outException(GlobException exception) { String content = String.format("****************系統發生異常(%s)************************", exception.getMessage()); System.out.println(content); } }
和上面的例子同樣,咱們如今實現一個完成登陸的接口。索引
@RequestMapping("/login") public ResponseEntity<?> login(String userName,String password){ Assert.isTrue(!(StringUtils.isEmpty(userName)||StringUtils.isEmpty(password)),"用戶名或密碼不能爲空"); User user = userService.queryByUserNameAndPassword(userName, password); Assert.notNull(user,"用戶名或密碼錯誤"); return ResponseEntity.success(user); }
如今咱們傳用戶名和密碼,其中帳號爲空:
接下來傳錯誤的用戶名和密碼
正確的帳號密碼,完成登陸