▄︻┻┳═一Agenda:html
▄︻┻┳═一(1/8)[代碼整潔之道]你真的會用枚舉嗎?非也!java
▄︻┻┳═一(2/8)枚舉的錯誤用法 之 方法參數post
▄︻┻┳═一(3/8)枚舉的錯誤用法 之 方法參數(二)url
▄︻┻┳═一(4/8)枚舉的錯誤用法 之 方法返回值spa
▄︻┻┳═一(5/8)枚舉的錯誤用法 之 方法體內部code
▄︻┻┳═一(6/8)枚舉的錯誤用法 之 分支判斷htm
▄︻┻┳═一(7/8)藉助枚舉說一下數據類型定義規範blog
▄︻┻┳═一(8/8)RPC接口能用枚舉就請考慮枚舉接口
繼續講枚舉的使用。本文舉例說明方法返回值使用枚舉類型對程序可讀性和可維護性的影響。字符串
以下代碼邏輯比較簡單:判斷busTyp和crdTyp不一樣狀況下的取值,來給字符串cnlTyp賦值,並最終返回這個字符串。
// PpdUtils.java /** * 獲取通道類型 * * @param busTyp * @param crdTyp * @return */ public static String getCnlTyp(String busTyp, String crdTyp) { String cnlTyp = ""; BusTypEnum busTypDict = BusTypEnum.getByKey(busTyp); switch (busTypDict) { case B2C_CHARGE: case B2C_CONSUME_COMPLETION: case GWAY_CONSUME_COMPLETION: case B2C_ENT_CONSUME_COMPLETION: case B2C_ENT_REPAYMENT: case PGW_GW_COMPLETION: case CREDIT_PAY_COMPLETION: case CREDIT_PAY_COMPLETION_REFUND: cnlTyp = CnlTypEnum.B2C.getValue(); break; case B2B_CHARGE: case B2B_CHARGE_FOR_ENT: case B2B_CHARGE_ORDER_ADDITIONAL: case B2B_ENT_CONSUME_COMPLETION: case B2B_ENT_REPAYMENT: case PGW_B2B_COMPLETION: cnlTyp = CnlTypEnum.B2B.getValue(); break; case QPAY_CONSUME_COMPLETION: case QUICK_CHARGE: case PGW_QPAY_COMPLETION: if (CardTypeEnum.CreditCard.equals(crdTyp)) { cnlTyp = CnlTypEnum.CQP.getValue(); } else { cnlTyp = CnlTypEnum.DQP.getValue(); } break; case OCP_CONSUME_COMPLETION: case OCP_ENT_CONSUME_COMPLETION: case OCP_ENT_REPAYMENT: case OCP_REFUND: cnlTyp = CnlTypEnum.OCP.getValue(); break; default: break; } return cnlTyp; }
本文重點討論的是方法的返回值。因此呢,對於上面的方法,咱們撇開兩個入參不說,其餘代碼不足也勿噴。
咱們注意到,方法體裏要返回的變量cnlTyp,在switch的每一個分支裏,給它的賦值都是CnlTypEnum項的value。
那麼,顯然,這個方法不必返回字符串了,而應該直接返回CnlTypEnum。一樣,方法內部的變量cnlTyp的類型重構爲CnlTypEnum。
這樣,相比於返回String,調用方能直觀的知道返回值的具體類型及可取值範圍,從而提升了可讀性。
重構後的代碼爲:
// PpdUtils.java /** * 獲取通道類型 * * @param busTyp * @param crdTyp * @return */ public static CnlTypEnum getCnlTyp(String busTyp, String crdTyp) { CnlTypEnum cnlTyp = null; BusTypEnum busTypDict = BusTypEnum.getByKey(busTyp); switch (busTypDict) { case B2C_CHARGE: case B2C_CONSUME_COMPLETION: case GWAY_CONSUME_COMPLETION: case B2C_ENT_CONSUME_COMPLETION: case B2C_ENT_REPAYMENT: case PGW_GW_COMPLETION: case CREDIT_PAY_COMPLETION: case CREDIT_PAY_COMPLETION_REFUND: cnlTyp = CnlTypEnum.B2C; break; case B2B_CHARGE: case B2B_CHARGE_FOR_ENT: case B2B_CHARGE_ORDER_ADDITIONAL: case B2B_ENT_CONSUME_COMPLETION: case B2B_ENT_REPAYMENT: case PGW_B2B_COMPLETION: cnlTyp = CnlTypEnum.B2B; break; case QPAY_CONSUME_COMPLETION: case QUICK_CHARGE: case PGW_QPAY_COMPLETION: if (CardTypeEnum.CreditCard.equals(crdTyp)) { cnlTyp = CnlTypEnum.CQP; } else { cnlTyp = CnlTypEnum.DQP; } break; case OCP_CONSUME_COMPLETION: case OCP_ENT_CONSUME_COMPLETION: case OCP_ENT_REPAYMENT: case OCP_REFUND: cnlTyp = CnlTypEnum.OCP; break; default: break; } return cnlTyp; }