packagecom.enums;importcom.google.common.base.Preconditions;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.util.ArrayList;importjava.util.List;/*** 从0开始的可索引枚举接口
*
* 实现此接口的枚举各元素的index可以不连续
* 建议:
* 此接口实现类的元素保持index的连续以节省空间
*
public interfaceIndexedEnum {/*** 取得该枚举元素的索引值
*
*@return返回>=0的索引值*/
public abstract intgetIndex();/*** 支持可索引枚举的工具类*/
public static final classIndexedEnumUtil {privateIndexedEnumUtil() {
}private static final Logger LOGGER = LoggerFactory.getLogger(IndexedEnumUtil.class);/*** 索引预警上限值,索引超过该上限可能存在空间浪费问题*/
private static final int WARNNING_MAX_INDEX = 1000;/*** 将枚举个元素放置ArrayList中,各元素在列表中的序列即为原则的index
* 如果有不连续的index,则列表中空缺的位置由null填充
*
*@paramenums 枚举元素数组
*@param 枚举泛型
*@return包含所有数组元素的List*/
public static ListtoIndexes(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 instances = new ArrayList(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);
}returninstances;
}/*** 根据指定序列从枚举列表中取得相应的枚举元素
*
* 注意:如果index参数小于0或者大于枚举元素最大索引值,返回null
*
*@paramvalues 枚举列表
*@paramindex 目标序列
*@param 枚举泛型
*@return
*/
public static E valueOf(List values, intindex) {if (index < 0 || index >=values.size()) {return null;
}returnvalues.get(index);
}
}
}