Java枚舉類的使用方法是什么

本篇內容介紹了“Java枚舉類的使用方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站建設、網(wǎng)站設計與策劃設計,秦淮網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設10余年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:秦淮等地區(qū)。秦淮做網(wǎng)站價格咨詢:18982081108

一 枚舉類有哪些特點

創(chuàng)建一個ColorEnum的枚舉類,通過編譯,再反編譯看看它發(fā)生了哪些變化。

public enum ColorEnum {     RED,GREEN,BULE; }

使用命令javac ColorEnum.java進行編譯生成class文件,然后再用命令javap -p  ColorEnum.class進行反編譯。

Java枚舉類的使用方法是什么

去掉包名,反編譯后的內容如下:

public final class ColorEnum extends Enum{     public static final ColorEnum GREEN;     public static final ColorEnum BULE;     private static final ColorEnum[] $VALUES;     public static ColorEnum[] values();     public static ColorEnum valueOf(java.lang.String);     private ColorEnum();     static {}; }
  1. 枚舉類被final修飾,因此枚舉類不能被繼承;

  2. 枚舉類默認繼承了Enum類,java不支持多繼承,因此枚舉類不能繼承其他類;

  3. 枚舉類的構造器是private修飾的,因此其他類不能通過構造器來獲取對象;

  4. 枚舉類的成員變量是static修飾的,可以用類名.變量來獲取對象;

  5. values()方法是獲取所有的枚舉實例;

  6. valueOf(java.lang.String)是根據(jù)名稱獲取對應的實例;

二 枚舉創(chuàng)建線程安全的單例模式

public enum  SingletonEnum {      INSTANCE;      public void doSomething(){         // dosomething...     } }

這樣一個單例模式就創(chuàng)建好了,通過SingletonEnum.INSTANCE來獲取對象就可以了。

2.1 序列化造成單例模式不安全

一個類如果如果實現(xiàn)了序列化接口,則可能破壞單例。每次反序列化一個序列化的一個實例對象都會創(chuàng)建一個新的實例。

枚舉序列化是由JVM保證的,每一個枚舉類型和定義的枚舉變量在JVM中都是唯一的,在枚舉類型的序列化和反序列化上,Java做了特殊的規(guī)定:在序列化時Java僅僅是將枚舉對象的name屬性輸出到結果中,反序列化的時候則是通過java.lang.Enum的valueOf方法來根據(jù)名字查找枚舉對象。同時,編譯器是不允許任何對這種序列化機制的定制的并禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法,從而保證了枚舉實例的唯一性。

2.2 反射造成單例模式不安全

通過反射強行調用私有構造器來生成實例對象,造成單例模式不安全。

Class<?> aClass = Class.forName("xx.xx.xx"); Constructor<?> constructor = aClass.getDeclaredConstructor(String.class); SingletonEnum singleton = (SingletonEnum) constructor.newInstance("Java旅途");

但是使用枚舉創(chuàng)建的單例完全不用考慮這個問題,來看看newInstance的源碼!

public T newInstance(Object ... initargs)     throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {     if (!override) {         if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {             Class<?> caller = Reflection.getCallerClass();             checkAccess(caller, clazz, null, modifiers);         }     }     // 如果是枚舉類型,直接拋出異常,不讓創(chuàng)建實例對象!     if ((clazz.getModifiers() & Modifier.ENUM) != 0)         throw new IllegalArgumentException("Cannot reflectively create enum objects");     ConstructorAccessor ca = constructorAccessor;   // read volatile     if (ca == null) {         ca = acquireConstructorAccessor();     }     @SuppressWarnings("unchecked")     T inst = (T) ca.newInstance(initargs);     return inst; }

如果是enum類型,則直接拋出異常Cannot reflectively create enum objects,無法通過反射創(chuàng)建實例對象!

三 通過枚舉消除if/else

假如要寫一套加密接口,分別給小程序、app和web端來使用,但是這三種客戶端的加密方式不一樣。一般情況下我們會傳一個類型type來判斷來源,然后調用對應的解密方法即可。代碼如下:

if("WEIXIN".equals(type)){     // dosomething }else if("APP".equals(type)){     // dosomething }else if("WEB".equals(type)){     // dosomething }

現(xiàn)在使用枚舉來消除這些if/else。

寫一個加密用的接口,有加密和解密兩個方法。然后用不同的算法去實現(xiàn)這個接口完成加解密。

public interface Util {      // 解密     String decrypt();      // 加密     String encrypt(); }

創(chuàng)建一個枚舉類來實現(xiàn)這個接口

public enum UtilEnum implements Util {      WEIXIN {         @Override         public String decrypt() {             return "微信解密";         }          @Override         public String encrypt() {             return "微信加密";         }     },     APP {         @Override         public String decrypt() {             return "app解密";         }          @Override         public String encrypt() {             return "app加密";         }     },     WEB {         @Override         public String decrypt() {             return "web解密";         }          @Override         public String encrypt() {             return "web加密";         }     }; }

最后,獲取到type后,直接調用解密方法就行了。

String decryptMessage = UtilEnum.valueOf(type).decrypt();

以后,如果新增了一個其他加密方式,只需要修改上面的枚舉類就完成了,業(yè)務代碼都不需要改動。

這就是枚舉類比較高級的兩個用法。

“Java枚舉類的使用方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

分享名稱:Java枚舉類的使用方法是什么
文章轉載:http://muchs.cn/article6/ihdpog.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊網(wǎng)站內鏈、網(wǎng)站排名、建站公司、手機網(wǎng)站建設、網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設網(wǎng)站維護公司