探索guava(一)——前置條件Preconditions類

做用

能夠簡潔的完成參數檢驗,在進行業務邏輯代碼前進行前置判斷。而且避免了冗長的if語句。guava將全部檢驗的API都放置於Preconditions類中前端

API

Preconditions類大體分爲6種提供參數檢驗的方法,每種方法都有三個重載方法。重載方法的參數意義是:express

  • 僅有待校驗的參數:拋出的異常中沒有錯誤消息;
  • 有一個Object對象做爲額外參數:拋出的異常使用Object.toString() 做爲錯誤消息;
  • *有一個String對象做爲額外參數,還有一個Object[]參數,這兩個參數也是適用於異常錯誤消息的,處理的方式相似於String.format將Object的參數按順序替換掉String中的佔位符(如%s)
  • 方法聲明(不包括額外參數) 描述 檢查失敗時拋出的異常
    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);
}

 

如今咱們傳用戶名和密碼,其中帳號爲空:

接下來傳錯誤的用戶名和密碼 

正確的帳號密碼,完成登陸

相關文章
相關標籤/搜索