搜尋

首頁  >  問答  >  主體

架构设计 - JAVA端的错误码和错误信息,该设计成全局常量还是枚举值?

Map<String,String> responseInfo = new HashTable<String,String>();
responseInfo.set("FE_PRC_BACK_001","TargetUri is not exist");
//responseInfo.set("FE_XREQ_002","Target Uri of XRequest is Empty.");
//responseInfo.set("FE_REQ_003","The processor flag is incorrect or the BusinessContext time out.");

FE_PRC_BACK_001这样的是错误码,TargetUri is not exist是错误信息,需要以键值对(JSON)的形式响应给浏览器
这时,JAVA端是应该以什么方式来罗列这些错误码和错误信息呢?常量?还是枚举类型?

String FE_PRC_BACK_001 = "TargetUri is not exist";

请教一下各位大神,你们的项目中都是怎么设计的?

黄舟黄舟2770 天前1014

全部回覆(3)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:18:48

    有以下2種解:
    1、封裝成一個對象,例如:

    public final class Result {
        private Result(String code, String msg){
            this.code = code;
            this.msg = msg;
        }
        
        // ignore setter and getter
        private String code;
        private String msg;
        
        public static final FE_PRC_BACK_001 = new Result("FE_PRC_BACK_001", "TargetUri is not exist");
        
        public static final ...
    }

    2、用枚舉實現,如下:

    public enum Result {
        FE_PRC_BACK_001("FE_PRC_BACK_001", "TargetUri is not exist"), 
        ...;
    
        // ignore setter and getter and constructor
        private String code;
        private String msg;
    }

    1和2的實現思路其實是差不多的(跟題主給出的代碼思路也是差不多的,差別只是使用具體的DTO还是通用的Map),但使用枚舉的時候有以下幾個地方要注意:
    假設枚舉Result存在於base-api中,版本1.0.0,分別有A、B項目,A項目依賴B項目,A、B項目皆依賴base-api
    1、如果B項目升級base-api至1.0. 1,且Result新增了一個枚舉量,且B專案某介面回傳了這個新增的枚舉量,而A專案在沒有升級base-api的情況下,如果呼叫到該介面並返回了新增的枚舉量,則會報反序列化異常,因為新增的枚舉量在舊版本的base-api裡並不存在;
    2、JSON序列化的時候,預設是把枚舉序列化成枚舉變數名稱,如果想要序列化成自訂的格式(例如包含msg),則需要自訂一個序列化器。

    回覆
    0
  • 阿神

    阿神2017-04-18 09:18:48

    如果所有錯誤訊息都已經確定了,可以寫在程式裡,用枚舉比用全域常數更容易。全域常數要對應錯誤碼和訊息還是比較痛苦。

    我最喜歡Java 的枚舉,主要是因為Java 的枚舉型別可以擴展,可以有構造,可以重寫toString … 因為Java 的枚舉本身就是一個對象,枚舉型別本身就是一個比較特殊的類。

    如果你的錯誤訊息不能固定,可能在應用過程中添加,保存在資料庫中。那就需要專門寫一套管理類別來處理,用 HashTable 或 HashMap 之類的方式來實作。不過估計你的問題搞不到這麼複雜。

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:18:48

    把錯誤的key放在java的列舉裡面,然後把錯誤的key和錯誤的資訊的映射放在外部文件中,例如properties文件裡。在運行時,根據錯誤枚舉的key來實時從文件中取出錯誤文本就可以了,因為錯誤不是經常發生的,實時讀取錯誤信息應該沒有問題,當然你也可以在程序啟動時候把所有的錯誤資訊讀進來然後放到快取里以提高效能。

    回覆
    0
  • 取消回覆