(2/8)枚舉的錯誤用法 之 方法參數

▄︻┻┳═一Agenda:html

▄︻┻┳═一(1/8)[代碼整潔之道]你真的會用枚舉嗎?非也!api

▄︻┻┳═一(2/8)枚舉的錯誤用法 之 方法參數app

▄︻┻┳═一(3/8)枚舉的錯誤用法 之 方法參數(二)post

▄︻┻┳═一(4/8)枚舉的錯誤用法 之 方法返回值this

▄︻┻┳═一(5/8)枚舉的錯誤用法 之 方法體內部url

▄︻┻┳═一(6/8)枚舉的錯誤用法 之 分支判斷spa

▄︻┻┳═一(7/8)藉助枚舉說一下數據類型定義規範debug

▄︻┻┳═一(8/8)RPC接口能用枚舉就請考慮枚舉code


 

 

【承上文】

承上文[代碼整潔之道]你真的會用枚舉嗎?非也!xml

敲黑板,劃重點:

若是把某域定義成了枚舉,那麼,正確使用枚舉要注意以下幾點

  • 除了對外交易的輸入輸出,程序內部涉及到該域的,一概用枚舉類型。例如:方法參數、方法返回值、bo的屬性。
  • 接收到外來的數據後,在使用該域時,應先把該域轉換成枚舉類型。

 

接下來舉例繼續嘮叨。

 

【不當用法】

以下方法:

    public static String getMNBNotifyUrl(YGBizMessageContext bizCtx, String reqCode, String notifyTyp,
            boolean isBack, Logger logger) {
        StringBuffer sb = new StringBuffer();
        sb.append(bizCtx.getPara("_MNB_NOTIFY_ADDR"));//cde syscfg.xml裏http://192.168.40.222:9280/bkg/
        sb.append(notifyTyp).append("/");

        if (isBack) {
            sb.append("b");
        }

        sb.append("notify").append(".");
        sb.append(reqCode);
        logger.infoFmt("獲取回調地址[{}]", sb.toString());

        return sb.toString();
    }

 

調用:

String noticeUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay.getValue(),
                NotifyDataTypeEnum.FORM.getNotifyTyp(), true, logger);//
String returnUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay.getValue(),
                NotifyDataTypeEnum.FORM.getNotifyTyp(), false, logger);//

 

【重構爲】

方法改成:

    public static String getMNBNotifyUrl(YGBizMessageContext bizCtx, MNBNotifyCodeEnum reqCode, NotifyDataTypeEnum notifyTyp,
            boolean isBack, Logger logger) {
        StringBuffer sb = new StringBuffer();
        sb.append(bizCtx.getPara("_MNB_NOTIFY_ADDR"));//cde syscfg.xml裏http://192.168.40.222:9280/bkg/
        sb.append(notifyTyp.getNotifyTyp()).append("/");

        if (isBack) {
            sb.append("b");
        }

        sb.append("notify").append(".");
        sb.append(reqCode.getValue());
        logger.infoFmt("獲取回調地址[{}]", sb.toString());

        return sb.toString();
    }

 

調用:

String noticeUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay, NotifyDataTypeEnum.FORM, true, logger);//
String returnUrl = MNBUtils.getMNBNotifyUrl(bizCtx, MNBNotifyCodeEnum.IBPay, NotifyDataTypeEnum.FORM, false, logger);//

 

【分析】

上面的getMNBNotifyUrl方法是一個Util方法,供工程裏其餘各module調用。其餘module的開發人跟這個方法的開發人每每不是同一我的。

咱們比較重構先後的可讀性,看原來的方法,reqCode和notifyTyp是String,調用者並不清楚傳什麼值,只有看哪裏調用了才能明白;若是找不到調用的代碼,那麼就只能去問定義這個方法的程序猿了。而重構後將這2個參數改成枚舉,一目瞭然!

退一萬步講,即便調用者和定義者是同一我的,重構後的代碼也比以前的要好,爲何?仍是那3個字:可讀性提升了。

 

【擴展:看開源項目中枚舉的使用】

以下是log4j-api包下的兩個方法。logIfEnabled方法是一個基礎方法,供debug、info、error、fatal等方法及重載方法調用。能夠看到,logIfEnabled方法的第二個參數是枚舉類型Level,而不是String。

//** abstract class AbstractLogger

public void error(Message msg, Throwable t) {
    this.logIfEnabled(FQCN, Level.ERROR, (Marker)null, (Message)msg, (Throwable)t);
}
public void error(String message, Object p0, Object p1) {
    this.logIfEnabled(FQCN, Level.ERROR, (Marker)null, message, p0, p1);
}
public void logIfEnabled(String fqcn, Level level, Marker marker, String message, Object p0, Object p1) {
    if (this.isEnabled(level, marker, message, p0, p1)) {
        this.logMessage(fqcn, level, marker, message, p0, p1);
    }

}
相關文章
相關標籤/搜索