1. 程式人生 > >【小家java】java中維護常量使用常量類?介面?還是列舉呢?

【小家java】java中維護常量使用常量類?介面?還是列舉呢?

相關閱讀

每篇一句

只要學不死,就往死裡學。我們離過勞死都還遠著呢

1、概述

在編碼過程中,避免不了維護一些常量。而通過這麼多的專案中發現,使用方式都不盡相同。有用常量類的、有用介面的、有用列舉的,因此本文針對於常量的管理做一些討論

2、栗子

第一種使用介面:

public interface Constants{
   int AUDIT_STATUS_PASS = 1;
   int AUDIT_STATUS_NOT_PASS = 2;
}

第二種使用常量類:

public class Constans{
    public static final int AUDIT_STATUS_PASS =
1; public static final int AUDIT_STATUS_NOT_PASS = 2; }

第三種使用列舉:

@Getter
@AllArgsConstructor
public enum ChildType {

    NORMAL_PARENT(0, "正規課"),
    TRIAL_PARENT(1, "體驗課");
    
    private int id;
    private String name;
}

相比較第一種和第二種其實差不多,但第一種顯然更簡潔,因為不用寫public static final了嘛,更方便了。但是,但是,但是不建議在介面中定義常量。因為我在閱讀《Effective Java》這本書中提到過:

如果某個實現了常量介面的類被修改不再需要常量了,也會因為序列化相容原因不得不保持該實現,而且非final類實現常量介面會導致所有子類被汙染

所以我個人推薦:介面中的常量, 不應該用於全域性. 而應當用在與之相關的類中。這樣能保持很好的層級關係和隔離性,方便分包和擴充套件,具體請參考spring中對常量維護的原則。
當然,剛才說了不建議把一般的常量放在接口裡,所以我們可以放在常量類了,但建議常量類是final的。

什麼時候使用列舉呢?其實建議使用列舉。《Effective Java》中也是推薦使用列舉代替int常量的。列舉當然是首選,另如果不用列舉,在《Effective Java》一書中,作者建議使用一般類加私有構造方法的方式,至於為什麼不用介面,那就要上升到語言哲學問題了(可參考上面通俗易懂的話)。

此處個人不建議什麼都使用列舉來代替常量類。比如毫無規則歸類可言的一些常量:如SUCCUSS字串、金鑰串、路徑等等這些,可以放在一個常量類裡面糅在一起。而對於資料庫中對應type、status型別欄位並且是可以枚舉出來的,強烈建議使用enum型別,在平時獲取、使用、校驗起來常量無法比擬的,而且可以很少犯錯,非常大程度上增加程式碼的可讀性,這也是為什麼JDK5要推薦使用列舉類的原因吧。

最後,本人建議大家可以在設計程式碼的時候,多用介面規範程式碼,哪怕只是一個標記介面,也儘量為了長遠考慮而設計出來。通過讀spring、mybatis原始碼會發現裡面不乏一些標記介面,在向上抽象歸類判斷的時候,非常有用。

3、使用場景

大力推薦列舉型別的使用,讓他無處不在的去管理你的程式碼,可以讓程式碼結構更加清晰易懂可擴充套件。而常量類可以收集管理一些比較雜的一些常量。而介面的中的常量,在遵循開閉原則的基礎上,向上抽象管理自己的內聚的常量

4、最後

寫程式碼也是一種藝術,結構層次好的程式碼可以少出bug,提高效率。用一句話總結就是:設計良好的程式碼結構,儘量面向元資料程式設計。

知識交流

在這裡插入圖片描述

若群二維碼失效,請加微訊號(或者掃描下方二維碼):fsx641385712。
並且備註:“java入群” 字樣,會手動邀請入群

在這裡插入圖片描述

相關推薦

Spring藉助Springfox整合Swagger(API介面神器)和SpringBoot

背景 隨著網際網路技術的發展,現在的網站架構基本都由原來的後端渲染,變成了:前端渲染、先後端分離的形態,而且前端技術和後端技術在各自的道路上越走越遠。 前端和後端的唯一聯絡,變成了API介面;API文件變成了前後端開發人員聯絡的紐帶,變得越來越重要,swagger就是一款讓你更好

面試螞蟻金服(2018年)Java一面面試題

相關閱讀 廢話不多說,直接把印象中的面試題貼出來: 雖然我自己沒有完全答得很好,但本文給出一些參考性的答案。如果覺得不妥的,可以給我留言討論 1、自我介紹、自己做的專案和技術領域 略 2、專案中的監控:常見的監控指標有哪些? QPS、進出口流量、C

SpringSpring IoC是如何使用BeanWrapper和Java內省結合起來給Bean屬性賦值的

每篇一句 具備了技術深度,遇到問題可以快速定位並從根本上解決。有了技術深度之後,學習其它技術可以更快,再深入其它技術也就不會害怕 相關閱讀 【小家Spring】聊聊Spring中的資料轉換:Converter、ConversionService、TypeConverter、PropertyEditor 【

SpringSpring AOP的多種使用方式以及神一樣的AspectJ-AOP使用介紹

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

思想通俗易懂版講解JWT和OAuth2,以及他倆的區別和聯絡(Token鑑權解決方案)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

SQLMySql資料型別---日期時間型別的使用(含datetime和timestamp的區別)

每篇一句 練武不練功,到老一場空。 程式設計師應該注重內功的修煉,那才是核心競爭力 說在前面 在這一路學習過來,每次不管看書還是網上看的資料,對於MySQL資料型別中的時間日期型別總是一掃而過,不曾停下來認認真真的研究學習。最近看了一本關於MySql的書

Spring老專案遷移問題:@ImportResource匯入的xml配置裡的Bean能夠使用@PropertySource匯入的屬性值嗎?

#### 每篇一句 > 大師都是偏執的,偏執才能產生力量,妥協是沒有力量的。你對全世界妥協了你就是空氣。所以若沒有偏見,哪來的大師呢 #### 相關閱讀 [【小家Spring】詳解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等對屬性配置檔案

javajava維護常量使用常量介面?還是列舉

相關閱讀 每篇一句 只要學不死,就往死裡學。我們離過勞死都還遠著呢 1、概述 在編碼過程中,避免不了維護一些常量。而通過這麼多的專案中發現,使用方式都不盡相同。有用常量類的、有用介面的、有用列舉的,因此本文針對於常量的管理做一些討論 2、栗子 第一種使用

javaJava對時間戳相加減的問題(向前推100天,答案卻讓我匪夷所思)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

JavaFuture、FutureTask、CompletionService、CompletableFuture解決多執行緒併發歸集問題的效率對比

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

javaJava主執行緒(父執行緒)與子執行緒的通訊和聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

javaJava的執行緒池,你真的用對了嗎?(教你用正確的姿勢使用執行緒池)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

javaJavaApache Commons-Collections4使用精講(對JDK集合功能的強有力擴充套件)

相關閱讀 前言 雖然JDK提供給我們的集合框架已經足夠強大,基本能解決我們平時的絕大所述問題,並且效率還挺高。 本文針對於Apache提供的Collections4元件提供的一些特殊資料結構,通過例子解決一些實際問題的講解。 ® bag介面 ® 固定大小的m

Javacommon-lang3StringUtils的使用詳解

相關閱讀 前言 上一篇博文已經講解了lang3下面的很多的API,但是StringUtils留在本文專門講解。因為這個工具類在日常使用中實在太多了。 本文的講解方式為:直接看例項,而不做過多的文字描述解釋 例項 public static boolean i

java靜態程式碼塊、構造程式碼塊、靜態變數執行順序和繼承邏輯

相關閱讀 每篇一句 上帝給每個人都安排了幸福的一生,我們的任務就是把它走完 1、概述 誠如各位所知,java的三大特性:封裝、繼承、多型。其中繼承,是java中最有學問的一點也是最相對來說最難理解的一些東西,本文針對於此,做一些例項分析,希望能夠幫助大家

java Restful風格的API設計,怎麼實現批量刪除?

相關閱讀 每篇一句 面試高大上,面試造飛機,工作擰螺絲 因此不能以為自己工作覺得還OK,就覺得自己技術還不錯了 如題,指的是在restful風格的url設計中,怎麼實現批量刪除呢? 這裡指的刪除是真刪除,不是邏輯刪除。如果是邏輯刪除,其實就是upd

javaJava二進位制與位運算(“^,&,>>,>>>”),使用移位演算法寫一個流水號生成器(訂單號生成器)

相關閱讀 每篇一句 高樓大廈,都是平地起的。 整個java體系,其實就是一本祕籍,那就是:java基礎! (基礎如果打的紮實,在實際開發工作中會帶來極大的助益) 二進位制 二進位制是計算技術中廣泛採用的一種數制。二進位制資料是用0和1兩個數碼來表示的

JavaFuture與FutureTask的區別與聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

javaPOP(面向過程程式設計)、OOP(面向物件程式設計)、AOP(面向切面程式設計)三種程式設計思想的區別和聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

javaSession和Cookie的區別和聯絡、分散式session的幾種實現方式

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9