Java枚举储存的一种索引实现方式

Posted SevenNight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java枚举储存的一种索引实现方式相关的知识,希望对你有一定的参考价值。

首先引入guava包(一个进行代码校验的工具类):

<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);
        }
    }

}

第二步:建立异常信息储存枚举类

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);
    }

}

 

以上是关于Java枚举储存的一种索引实现方式的主要内容,如果未能解决你的问题,请参考以下文章

单例模式中为什么用枚举更好

单例模式中为什么用枚举更好?

常用的几个JQuery代码片段

12个用得着的 JQuery 代码片段

《Java高级语法》第7节:枚举

Java 枚举类的基本使用