JAVA常量類的實現方式_列舉類_專案實踐
前言
眾所周知,系統裡有很多比如訂單狀態、稽核狀態;性別、結算方式、交易型別等屬性,這些屬性只有幾個值,一般用0、1、2、3等的數字標識存入資料庫,每次對這些屬性所屬物件的增刪改操作,都會在程式碼裡給狀態設定值,由於專案是多人開發的,如果每次設定值的時候都直接set 0、1、2,容易出錯,而且狀態假設不用0、1、2表示了,用1、2、3表示,這時候所有set狀態的地方都得改變,維護麻煩。所以用常量表示狀態值,甚好。
據我目前所知,系統裡實現常量的方式有三種:
1, 介面常量
2, 類常量
3, 列舉
一:介面常量
Java程式裡實現常量,jdk1.5之前,沒有列舉類,有的用的介面來實現系統中的常量:
如java的swing裡有一個SwingConstant:
public interface SwingConstants { /** * The central position in an area. Used for * both compass-direction constants (NORTH, etc.) * and box-orientation constants (TOP, etc.). */ public static final int CENTER = 0; // // Box-orientation constant used to specify locations in a box. // /** * Box-orientation constant used to specify the top of a box. */ public static final int TOP = 1; /** * Box-orientation constant used to specify the left side of a box. */ public static final int LEFT = 2; //。。。省略其他程式碼 }
介面常量,寫起來方便,看著簡潔,但是為了讓其他人知道每個常量的含義,必須寫註釋,如果需要在用到常量對應的資訊時候,需要看著註釋來寫。
如:在其他地方需要用到 SwingConstants.CENTER 的含義,必須看類裡的註釋,知道他表示中心。如果常量很多的話,把所有的常量都放在這一個接口裡邊,這種方式感覺也不是很友好。
(申哥,瑞友的架構師,我的老鄉、偶像)看了申哥以前的專案,發現一個常量類,也是介面常量類,在接口裡定義靜態內部類,但是比上邊這種要好,他可以把不同的功能的常量類進一步分類,看程式碼:
public interface UtilConstants { /** * * 公共常量 * */ public static class Public { public static final String ID = "TESTID"; } /** * JSP路徑 */ public static class JspFilePath { public static final String TESTCONTROLLER = "jsp/basic/"; public static final String TEMPLATE_PAGEPATH = "basic/template/"; // 模板(測試) } /** * vo 物件的一些公共的屬性名稱 * */ public static class VoFields { public static final String ACTIONTIME = "operateTime";//操作時間 public static final String ACTIONUSERNAME = "operatorName";//操作人姓名 public static final String CHECKTIME = "auditTime";//稽核時間 public static final String CHECKUSERID = "checkUserId";//稽核人ID public static final String CHECKUSERNAME = "auditPerson";//稽核人姓名 public static final String CREATETIME = "createTime"; // 建立時間 public static final String CREATEUSERID = "createUserId";// 建立人code public static final String INSERTUSERNAME = "createUserName";// 建立人姓名 public static final String UPDATETIME = "updateTime"; // 修改時間 public static final String UPDATEUSERID = "updateUserId";// 修改人CODE public static final String UPDATEUSERNAME = "updateUserName";// 修改人姓名 public static final String DELFLAG = "delFlag"; // 刪除標記 public static final String DBID = "dbid"; // 主鍵 } }
使用,把不同功能的常量放在了介面的內部類裡,通過不同的內部類,呼叫的時候可以更明確好找吧。
UtilConstants.JspFilePath.TEMPLATE_PAGEPATH UtilConstants.VoFields.CHECKTIME
二:類常量
目前中彩網的專案是這樣做的,還有過完年去待過4天的蛋疼學院的程式碼,也是這麼做的,雖然有了列舉,可能是由於設計者習慣問題,還有很多人用的類常量,
定義了類常量,用一個Map<Integer, String>來封裝常量對應的資訊,在static程式碼塊裡,類初始化的時候執行一次put。用的時候
ResponseCode.RESP_INFO.get("DATABASE_EXCEPTION");就能取出響應資訊
由於專案是前後端分離,在介面文件裡需要寫上狀態碼,還得寫上狀態碼對應的提示資訊,而且我們的響應類 RespInfo 有message屬性,就是儲存常量類裡狀態碼對應的資訊的。
程式碼:
public class ResponseCode { /** 系統處理正常 */ public static final int SUCCESS_HEAD = 0; /** 系統處理未知異常 */ public static final int EXCEPTION_HEAD = 1; /** JSON解析錯誤 */ public static final int JSON_RESOLVE = 2; /** 型別不匹配 */ public static final int TRANSTYPE_NO = 3; /** Head - messageID未賦值 */ public static final int HEAD_messageID = 4; /** Head - timeStamp未賦值 */ public static final int HEAD_timeStamp = 5; /** Head - messengerID未賦值 */ public static final int HEAD_messengerID = 6; /** Head - transactionType 未賦值 */ public static final int HEAD_transactionType = 7; /** digest校驗不通過 */ public static final int HEAD_DIGEST = 8; /** src校驗不通過 */ public static final int HEAD_SRC_NULL = 10; /** 協議包含非法字元 */ public static final int ILLEGAL_MESSAGE = 11; /** 資料庫異常 */ public static final int DATABASE_EXCEPTION = 9; public static final Map<Integer, String> RESP_INFO = new HashMap<Integer, String>(); static { // Head 相關 RESP_INFO.put(SUCCESS_HEAD, "系統處理正常"); RESP_INFO.put(EXCEPTION_HEAD, "系統處理未知異常"); RESP_INFO.put(JSON_RESOLVE, "JSON解析錯誤"); RESP_INFO.put(TRANSTYPE_NO, "型別不匹配"); RESP_INFO.put(HEAD_messageID, "messageID未賦值"); RESP_INFO.put(HEAD_timeStamp, "timeStamp未賦值"); RESP_INFO.put(HEAD_messengerID, "messengerID未賦值"); RESP_INFO.put(HEAD_transactionType, "transactionType未賦值"); RESP_INFO.put(HEAD_DIGEST, "digest校驗不通過"); RESP_INFO.put(DATABASE_EXCEPTION, "資料庫異常"); RESP_INFO.put(HEAD_SRC_NULL, "src未賦值"); RESP_INFO.put(ILLEGAL_MESSAGE, "協議包含非法字元"); } }
這種類常量比介面常量好,因為可以定義狀態碼對應的提示資訊。
三:列舉
所有的列舉類都是Enum類的子類,就行Object類一樣,只是沒有寫出來,所以可以列舉類可呼叫Enum的方法。注意是逗號分隔屬性,只有屬性後邊沒有方法的話,最後加不加分號都行
程式碼:
public enum Season { SPRING,SUMMER,AUTUMN ,WINTER }
使用:可以直接使用屬性,也可以呼叫Enum的方法如values方法
System.out.println(Season.AUTUMN); System.out.println(Season.values()); Season[] values = Season.values(); System.out.println(values[0]);
可以在列舉類中新增一些構造器、方法和域:
私有化構造器,構造器只是在構造列舉常量的時候被呼叫如SMALL(“S”)
/** * 衣服尺寸 */ public enum Size { SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL"); /** * 縮寫 */ private String suoxie; private Size(String suoxie){ this.suoxie = suoxie; } public String getSuoxie(){ return suoxie; } public static void main(String[] args) { //1:toString()方法返回常量的名 System.out.println(Size.SMALL.toString());//SMALL //2:valueOf() System.out.println(Size.valueOf("LARGE")); //3:values:返回每個常量名 //SMALL MEDIUM LARGE EXTRA_LARGE Size[] sizes = Size.values(); /*for (Size size : sizes) { System.out.println(size); }*/ //4:ordinal 返回常量的位置,從0開始 System.out.println(Size.LARGE.ordinal()); int i = Size.EXTRA_LARGE.compareTo(Size.EXTRA_LARGE); System.out.println(i); System.out.println(Size.LARGE.getSuoxie()); } }
申哥的列舉:
實際專案中不會每個型別都弄一個列舉類,假設那樣,系統中會有很多列舉類,每個類裡邊只有幾個屬性,那樣類太多,感覺沒必要,所以申哥設計了一個常量類Constants,在常量類裡定義了多個靜態列舉類,這個和上邊說的申哥在介面常量裡定義靜態內部類有點類似,不過現在換成了列舉。
接口裡定義靜態內部類好處:對不同功能的常量進行分類,用起來比較明確,但是由於是interface,裡邊不能定義static靜態程式碼塊,所以沒辦法像類常量那樣即定義常量狀態碼,又在map裡放對應的說明資訊,只能通過註釋給開發人員用的時候看。
申哥的這種做法算是兩全其美,在一個常量類裡,定義多個靜態的列舉,列舉類定義兩個引數的構造器,一個相當於key,一個是value,屬性也是final型別的,每個列舉對應實體物件的一種狀態,甚好。
程式碼:
public class Constants { public static enum Dict{ PROSTA("PROSTA","產品狀態"), COUNTRY("COUNTRY","國家"), YWLX("YWLX","業務型別"), INDUSTRYCOMPANYTYPE("IndustryCompanyType","公司型別"), JSFS("JSFS","結算方式"), COMMISSIONTYPE("COMMISSIONTYPE","返傭型別"), BALUNITTYPE("BALUNITTYPE","結算單位型別"), ORDERSTATS("OrderStats","訂單狀態"), BACKORDERSTATUS("BackOrderStatus","退單稽核狀態"), BUSINESSPAYMENT("BusinessPayment","業務款項"), ENABLESTATE("enableState","啟用禁用"), APPROVESTATE("approveState","審批狀態"), // 分銷系統所需是商品系統的xml PRODUCTCONTENTTYPE("productContentType","商品內容分類"), IDENTITY("identity","適應人群"), AREA("area","領區"), VISATYPE("visatype","簽證型別"), SERVICETYPE("serviceType","公證認證商品內容分類"), PRODUCTTYPEQUALITY("productTypeQuality","公證認證商品性質"), EXPRESSTYPE("expresstype","公證認證加急種類"), IDETIFICATIONTYPE("identificationType","認證類別"), QYKHLX("QYKHLX","客戶型別"), ZILIAONAME("ziliaoName","資料名稱"), YESORNO("yesOrNo","是否"); private Dict(String value,String name){ this.value=value; this.name=name; } private final String value; private final String name; public String getValue() { return value; } public String getName() { return name; } } /** * 訂單狀態 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum OrderStats{ DELETE(0,"刪除"),RESERVE(1,"訂單預定"),CONFIRM(2,"訂單確認"),COMPLETE(3,"訂單完成"),CLOSE(4,"訂單關閉"); private OrderStats(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } /** * 性別 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum sex{ MAN("1","男"),FEMAN("2","女"); private sex(String value,String name){ this.value = value; this.name = name; } private final String value; private final String name; public String getValue() { return value; } public String getName() { return name; } } /** * 退單稽核狀態 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum BackOrderStatus{ WAIT(1,"待稽核"),AUDIT(2,"稽核中"),PASS(3,"稽核通過"),NOTPASS(4,"稽核不通過"); private BackOrderStatus(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } /** * 結算方式 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum jiesuan{ XIANJIE("1","現結"),YUEJIE("2","月結"); private jiesuan(String value,String name){ this.value = value; this.name = name; } private final String value; private final String name; public String getValue() { return value; } public String getName() { return name; } } /** * 業務款項 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum BusinessPayment{ VISA("FUND18","簽證費"),PREMIUMS("FUND07","保險"),DEPOSIT("FUND10","押金"),CANCELLING("FUND12","取消金"),FUND20("FUND20","單項服務"),FUND14("FUND14","認證費"),FUND09("FUND09","團款"); private BusinessPayment(String value,String name){ this.value = value; this.name = name; } private final String value; private final String name; public String getValue() { return value; } public String getName() { return name; } } /** * 通用的啟用禁用狀態 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum EnableState{ DISABLE(0,"禁用"),ENABLE(1,"啟用"); private EnableState(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } /** * 通用的審批狀態 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum ApproveState{ REJECT(0,"不通過"),PASS(1,"通過"); private ApproveState(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } /** * 通用的是否 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-14 */ public static enum YesOrNo{ NO(0,"否"),YES(1,"是"); private YesOrNo(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } /** * 業務狀態 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-18 */ public static enum ServiceStatus{ NORMAL(1,"正常辦理"),CHANGEING(2,"應收變更中"),BACKING(3,"退單中"),BACK(4,"退單"); private ServiceStatus(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } /** * 支付狀態 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-16 */ public static enum PayStatus{ NOTPAY("01","未支付"),PARTPAY("02","部分支付"),FINISHPAY("03","支付完成"); private PayStatus(String value,String name){ this.value = value; this.name = name; } private final String value; private final String name; public String getValue() { return value; } public String getName() { return name; } } public static enum DeleteStatus{ NORMAL(1,"正常"),DELETE(0,"刪除"); private DeleteStatus(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } /** * 訂單型別,主要是判斷訂單是從哪個系統推送過來的, * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-16 */ public static enum OrderType{ SALE("DDLY010301","ERP"),DISTRIBUTION("DDLY0104","分銷平臺"); private OrderType(String value,String name){ this.value = value; this.name = name; } private final String value; private final String name; public String getValue() { return value; } public String getName() { return name; } } public static enum CommonFieldEnum { DBID("dbid",UUID.randomUUID().toString().replace("-", "")), //主鍵 CREATEPERSONNAME("createpersonname","username"),//建立人姓名 CREATEPERSONCODE("createpersoncode","usercode"),//建立人姓名 CREATEUSTIME("createtime",new Date()),//建立時間 UPDATEPERSONNAME("updatepersonname","username"),//更新人姓名 UPDATEPERSONCODE("updatepersoncode","usercode"),//更新人姓名 UPDATETIME("updatetime",new Date()),//更新時間 ACTIONPERSONNAME("actionpersonname","username"),//操作人姓名 ACTIONPERSONCODE("actionpersoncode","usercode"),//操作人code ACTIONTIME("actiontime",new Date()),//操作時間 ; private CommonFieldEnum(String value, Object type) { this.value = value; this.type = type; } private final String value; private final Object type; public String getValue() { return value; } public Object getType() { return type; } } /** * 業務型別 * <p>Company:rayootech</p> * @author xudf * @date 2016-6-17 */ public static enum BusinessType{ NOTARY("YWLX09","簽證-公證認證"),VISA("YWLX10","簽證-單辦簽證"),NOTVISA("YWLX16","簽證其他"),INSURANCE("YWLX11","保險-單辦保險"); private BusinessType(String value,String name){ this.value = value; this.name = name; } private final String value; private final String name; public String getValue() { return value; } public String getName() { return name; } } /** * 鎖單狀態 * <p>Company:rayootech</p> * @author zhangxueshen * @date 2016-6-16 */ public static enum LockStatus{ NORMAL(0,"正常"),RECEIVCHANGE(1,"應收變更鎖單中"),SEALED(2,"客人封存更鎖單中"),BACK(3,"退單更鎖單中"); private LockStatus(Integer value,String name){ this.value = value; this.name = name; } private final Integer value; private final String name; public Integer getValue() { return value; } public String getName() { return name; } } public static void main(String[] args) { String key = Constants.ServiceStatus.NORMAL.getName(); int value = Constants.ServiceStatus.NORMAL.getValue(); System.out.println(key+":"+ value); } }
相關推薦
JAVA常量類的實現方式_列舉類_專案實踐
前言 眾所周知,系統裡有很多比如訂單狀態、稽核狀態;性別、結算方式、交易型別等屬性,這些屬性只有幾個值,一般用0、1、2、3等的數字標識存入資料庫,每次對這些屬性所屬物件的增刪改操作,都會在程式碼裡給狀態設定值,由於專案是多人開發的,如果每次設定值的時候都直接set 0
Integer類實現方式和註意事項
裝箱 col 基本類 引用 big 長度 i++ length 通過 java.lang.Integer類的源代碼: //定義一個長度為256的Integer數組 static final Integer[] cache = new Integer[-(-128) + 1
Java序列化的方式、object類中的方法、介面和抽象類的區別、ArrayList在迴圈過程中刪除
Java序列化的方式 a.是相應的物件實現了序列化介面Serializable,這個使用的比較多,對於序列化介面Serializable介面是一個空的介面,它的主要作用就是標識這個物件時可序列化的,jre物件在傳輸物件的時候會進行相關的封裝。 b.Externlizab
重新認識java(十) ---- Enum(列舉類)
有的人說,不推薦使用列舉。有的人說,列舉很好用。究竟怎麼使用,如何使用,仁者見仁智者見智。總之,先學會再說~ 為什麼要引入列舉類 一個小案例 你寫了一個小程式,不過好久不用了,突然有一天,你想使用一下它。程式要想正確執行,需要將今天星期幾存
JAVA第四次作業——使用列舉類對撲克牌建模
0x00 簡述 使用列舉型別對一副撲克牌(52張牌,不包括大小王)建模: 一副撲克牌有四種花色(Suit):HEART,SPADE,DIAMOND,CLUB; 有十三種等級(Rank):ACE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIG
Java自定義實現Comparable介面的類,實現多維排序
Java中提供了Arrays和Collections類能夠幫助我們來實現排序,但是前提是陣列或者集合中的元素都必須實現Comparable介面,基本的資料型別對應的類都已經實現了Comparable介面了,所以我們才能夠直接對含有基本型別的陣列和集合進行排序,大家可以看一下
利用java反射機制實現javaweb自動呼叫類的方法
public class BookServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequ
java根據輸入值例項化列舉類enum-switch
java5引入了列舉類這一新特性,最近開發用到了,主要是用來解決將大量判斷if-else語句轉換為switch-case語句,這樣程式從執行效率和可讀性都會得到很大提升。 關於列舉類,網上的資料都沒怎麼提到,如何根據一個動態的輸入值,來得到該列舉類的例項,這裡參考了一篇文章
史上最全面的SignalR系列教程-2、SignalR 實現推送功能-永久連線類實現方式
1、概述 通過上篇史上最全面的SignalR系列教程-1、認識SignalR文章的介紹,我們對SignalR技術已經有了一個全面的瞭解。本篇開始就通過SignalR的典型應用的實現方式做介紹,例子雖然簡單,但麻雀雖小五臟俱全。可以以此為基礎,擴充套件到實際應用中。 SignalR 的實現機制與.NET WCF
史上最全面的SignalR系列教程-3、SignalR 實現推送功能-集線器類實現方式
1、概述 通過前兩篇 史上最全面的SignalR系列教程-1、認識SignalR 史上最全面的SignalR系列教程-2、SignalR 實現推送功能-永久連線類實現方式 文章對SignalR的介紹,我們對SignalR已經有了全面的認識。SignalR API 客戶端和伺服器端持久連線的通訊方式,一次連線代
連結串列反轉(Java三種實現方式)
Mackyhuang 連結串列這個資料結果經常遇見,這裡提供一個連結串列反轉的java程式碼實現,有三種演算法,一種是遞迴的,倆種是非遞迴的。 首先為了方便測試,在博文最後貼上遞迴實現連結串列建立的程式碼,以供讀者快速上手測試,提供的程式碼可以複製以後直接測
Java 執行緒實現方式
程序與執行緒 在傳統的作業系統中,最核心的概念是“程序”,程序是對正在執行的程式的一個抽象。程序的存在讓“並行”成為了可能,在一個作業系統中,允許執行著多個程序,這些程序“看起來”是同時在執行的。如果我們的計算機同時執行著 web 瀏覽器、電子郵件客戶端、即時通訊軟
淺談JAVA常用分散式實現方式及優缺點
常用的有EJB、rmi、Web Service,還有Hessian、NIO等,它們的優缺點比較比下:1:EJB 優勢:可擴充套件性好,安全性強,支援分散式事務處理。 劣勢:不能跨語言;配置相對複雜,不同J2EE容器之間很難做無縫遷移。2:rmi 優勢:面向物件的遠端服務模型;基於TCP協議上
【C/C++開發】C++之enum列舉量宣告、定義、使用與列舉類詳解與列舉類前置型別宣告
前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1; 列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列
JAVA常用集合實現方式的總結
本篇主要是對之前的集合原始碼閱讀系列部落格的一個總結,如果沒有看過之前的部落格或者集合原始碼,很可能看不懂下面的內容。 文章開始之前,首先簡單回顧一下資料結構中定義的物理結構和
java匯出word實現方式一,在jsp中實現
參考:http://ll-feng.iteye.com/blog/345873 在jsp頁面中引入下面: <%@ page contentType="application/vnd.ms-word; charset=utf-8"%> <%@pag
你瞭解封裝類和類的繼承以及列舉類之間的恩怨糾葛嗎?
作者:feintkotlin(Kotlin學習網) Kotlin學習QQ群:543182119 說明:文章的內容是基於Kotlin的語法 對與類的繼承和列舉類,大家應該都比較熟悉。但咱還是要簡單的進行一下說明。 類的繼承就好比是泰迪到處播
Python 元類,MethodType,列舉類
元類 簡介 類也是物件,你可以在執行時動態的建立它們,就像其他任何物件一樣;當你使用class關鍵字時,Python直譯器自動建立這個物件 元類就是用來建立類的“東西”;元類就是類的類 Python中所有的東西,注意,我是指所有的東西——都是
快排的java兩種實現方式
快排是最基礎的幾個排序演算法之一,今天再來回顧下 public class QuickSort { public static void quickSort(int[] array){ if(array != null){ quickSort(array,
思想無語言邊界:以 cglib 介紹 AOP 在 java 的一個實現方式
# 0. 前言 上接:基於 Source Generators 做個 AOP 靜態編織小實驗 作為第三篇,我們基於cglib在java做一個簡單的aop例子, 以此簡單作為例子說一個思路在什麼樣的語言裡面都是共同的,這是骨,不要糾結什麼語言什麼實現,這只是皮。 同以前一樣,是個人隨筆,不是新手教學,不