首先引入guava包(一個進行代碼校驗的工具類):java
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency>
第一步:創建索引枚舉的接口數組
package com.enums; import com.google.common.base.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; /** * 從0開始的可索引枚舉接口 * <p/> * 實現此接口的枚舉各元素的index能夠不連續<br/> * <b>建議:</b> * 此接口實現類的元素保持index的連續以節省空間 * <p/> */ public interface IndexedEnum { /** * 取得該枚舉元素的索引值 * * @return 返回>=0的索引值 */ public abstract int getIndex(); /** * 支持可索引枚舉的工具類 */ public static final class IndexedEnumUtil { private IndexedEnumUtil() { } private static final Logger LOGGER = LoggerFactory.getLogger(IndexedEnumUtil.class); /** * 索引預警上限值,索引超過該上限可能存在空間浪費問題 */ private static final int WARNNING_MAX_INDEX = 1000; /** * 將枚舉個元素放置ArrayList中,各元素在列表中的序列即爲原則的index<br/> * 若是有不連續的index,則列表中空缺的位置由null填充 * * @param enums 枚舉元素數組 * @param <E> 枚舉泛型 * @return 包含全部數組元素的List */ public static <E extends IndexedEnum> List<E> toIndexes(E[] enums) { Preconditions.checkState((enums != null && enums.length > 0), "The Array of Enum[%s] cannot be null or empty.", enums.getClass().getComponentType().getName()); int maxIndex = Integer.MIN_VALUE; int curIdx = 0; // 取得最大index的值,該值+1的結果就是目標容器的size for (E enm : enums) { curIdx = enm.getIndex(); Preconditions.checkArgument(curIdx >= 0, "The index of Enum[%s] must be >= 0.", enm); if (curIdx > maxIndex) { maxIndex = curIdx; } } if (maxIndex >= WARNNING_MAX_INDEX) { LOGGER.warn("The index of Enum[{}] exceed threshold:{}.There is wasting memory probably.", enums.getClass().getComponentType().getName(), WARNNING_MAX_INDEX); } List<E> instances = new ArrayList<E>(maxIndex + 1); // 容器暫用null填充 for (int i = 0; i < maxIndex + 1; i++) { instances.add(null); } for (E enm : enums) { curIdx = enm.getIndex(); // 索引必須惟一 Preconditions.checkState(instances.get(curIdx) == null, "The index of Enum[%s] is not unique.", enums.getClass().getComponentType().getName()); instances.set(curIdx, enm); } return instances; } /** * 根據指定序列從枚舉列表中取得相應的枚舉元素 * <p/> * <b>注意:若是index參數小於0或者大於枚舉元素最大索引值,返回null</b> * * @param values 枚舉列表 * @param index 目標序列 * @param <E> 枚舉泛型 * @return */ public static <E extends IndexedEnum> E valueOf(List<E> values, int index) { if (index < 0 || index >= values.size()) { return null; } return values.get(index); } } }
第二步:創建異常信息儲存枚舉類ide
package com.enums; import java.util.List; /** * 異常枚舉 */ public enum ExceptionEnum implements IndexedEnum { EX_LOGIN(0, "登陸異常"), EX_DOWN(1, "下載異常"); private static final List<ExceptionEnum> INDEXS = IndexedEnumUtil.toIndexes(ExceptionEnum.values()); /** * 索引 */ private int index; /** * 拼音 */ private String message; ExceptionEnum(int index, String message) { this.index = index; this.message = message; } @Override public int getIndex() { return index; } public String getMessage() { return message; } /** * 根據index 獲取指定形式名稱 * * @param index * @return */ public static ExceptionEnum indexOf(final int index) { return IndexedEnumUtil.valueOf(INDEXS, index); } }