標籤:就會 code ret 做了 ring effect 而且 ati 問題
0.背景
情境是這樣的,用戶端要發送JSON資料到達服務端解析,由於用戶端的不同版本更新,打過來的資料有差異,服務端要相容這種差異對不同的處理這些資料,因為用戶端升級是由使用者決定的。
1.思路
實現的方式肯定很多種,恰好學到《effective java》中的枚舉,枚舉可以加一個方法,我們這個情境每一種日誌格式就對應於一種解析的方法。
public enum LogVersion { OLD(0),NEW(1){ @Override public String parseLog(JSONObject jsonObject) { return jsonObject.toString() + "new"; } }; private final int num; private LogVersion(int num) { this.num = num; } public String parseLog(JSONObject jsonObject) { return jsonObject.toString(); } public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); String oldVersionLog = OLD.parseLog(jsonObject); String newVersionLog = NEW.parseLog(jsonObject); System.out.println(oldVersionLog); System.out.printf(newVersionLog); }}
當然,項目中實現的邏輯比這個複雜得多。但是,這樣做就好嗎?極致的代碼都在追求:擴充性、複用性、效能。如果用戶端再發一個版本,我們在裡面重寫解析方法就好;當很多不同類型的用戶端覺得這個處理邏輯很相似,需要複用這個LogVersion的處理,這樣就會帶來問題,首先是命名我們命得不好,另外是把不同的用戶端日誌放在同一個Enum中處理並不是那麼的優雅,而且邏輯上我們本來就應該想辦法把他分開。如何來擴充這個Enum?
1.0 enum是什嗎?
enum就是一個類,只不過這個類編譯器額外的幫我們做了一些事情:
1.enum會自動繼承Enum<T>這個類;由於java不支援多繼承,這個類被聲明成enum就不能再繼承其他類了,所以這就是enum 不能用繼承來擴充的原因。
2.enum變數編譯器會偷偷的在前面加 public static final
1.1 如何擴充enum
根據1.0中的第一點,我們只能用介面來擴充,以達到代碼邏輯結構清晰的目的。
//todo
reference
https://www.zhihu.com/question/51987179/answer/128434410
java枚舉運用