(3/8)枚舉的不當用法 之 方法參數(二)

▄︻┻┳═一Agenda:html

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

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

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

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

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

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

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

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


 

 

繼續講枚舉的使用。本文舉例說明方法的參數不用枚舉所帶來的蹩腳之處。接口

【先上代碼】

先看以下方法:

private boolean updRpmRtulProcc(RpmRtulDO rpmRtulDO, String rfdSts)
        throws YGException {
    logger.infoFmt("修改退款訂單狀態爲失敗[{}]", RefundStsEnum.getBySts(rfdSts).getDesc());
    rpmRtulDO.setRfdSts(rfdSts);
    
    ... ...
    
    return true;
}

 

程序裏對這個方法的調用:

if (!updRpmRtulProcc(rpmRtul, RefundStsEnum.RFD_CLEARING_PROC.getSts())) {
    ... ...
}

 

以下是RefundStsEnum枚舉類:

/**
 * 退款狀態枚舉
 */
public enum RefundStsEnum {

    RFD_PROCESS("0","退款處理中"),
    RFD_SUCC("3","退款成功"),
    RFD_FAIL("4","退款失敗"),
    RFD_CANCEL("7","退款取消"),
    RFD_CLEARING_PROC("8","退款清結算處理中"),
    RFD_ACCOUNTING_PROC("9","退款記帳處理中"),
    REFUSE("R9", "審批拒絕"),
    RFD_APPROVAL("W3", "退款審批中");


    private String sts;
    private String desc;

    RefundStsEnum(String sts, String desc) {
        this.sts = sts;
        this.desc = desc;
    }

    public String getSts() {
        return sts;
    }

    public String getDesc() {
        return desc;
    }

    public static RefundStsEnum getBySts(String sts) {
        for (RefundStsEnum type : values()) {
            if (type.getSts().equals(sts)) {
                return type;
            }
        }
        return null;
    }
}

 

【重構方式】

上面方法中的String變量rfdSts,在程序裏有定義對應的枚舉類型RefundStsEnum。

本例是典型的枚舉使用不當。癥結在於將方法參數rfdSts定義成了String,這致使了兩點不爽:

  1. 該方法內部,如第一行,打日誌時,先調用枚舉RefundStsEnum的getBySts(),將rfdSts所存的RefundStsEnum的sts轉換成枚舉RefundStsEnum,而後,獲取它的desc。
  2. 調用該方法傳的參數是RefundStsEnum.getSts()

正確的實現方式是:將方法參數rfdSts定義爲枚舉類型RefundStsEnum,天然,就不存在以上的不爽了。這樣會很清晰!

private boolean updRpmRtulProcc(RpmRtulDO rpmRtulDO, RefundStsEnum rfdSts)
        throws YGException {
    logger.infoFmt("修改退款訂單狀態爲失敗[{}]", rfdSts.getDesc());
    rpmRtulDO.setRfdSts(rfdSts.getSts());
    
    ... ...
    
    return true;
}
相關文章
相關標籤/搜索