首先引入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枚举储存的一种索引实现方式的更多相关文章

  1. Java枚举类的7种常用的方法

    转载于:https://www.cnblogs.com/xhlwjy/p/11314368.html

  2. 牛客网Java刷题知识点之四种不同的方式创建线程

    不多说,直接上干货! 有4种方式可以用来创建线程: 第一种:继承Thread类,重写run方法 第二种:实现Runnable接口,并实现该接口的run方法(一般我们在编程的时候推荐用这种) 第三种:实 ...

  3. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  4. java枚举和constant使用区别

    本文结合<Effective Java>第六章前半部分关于枚举的介绍和自己的理解及实践,讲解了Java枚举的知识点.文章发布于专栏Effective Java,欢迎读者订阅. 前言  你代 ...

  5. 【转】Java 枚举7常见种用法

    原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu  原创地址:http://blog.li ...

  6. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  7. Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)

    示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date ...

  8. Java 枚举常见7种用法

    用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. publ ...

  9. Mysql几种索引类型的区别及适用情况

    如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE. 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyI ...

随机推荐

  1. Activity的运行过程

    今天看到了这个关于Activity的过程这个方面的知识,之前我其实也是做过安卓项目的,也是有安卓开发的一定经验的,但是我发现之前似乎是知其然,而不知其所以然,之前来说只知道activity里的onCr ...

  2. ucloud发送短信的php sdk

    在ucloud官方的版本中,只有python的sdk可供调用,现提供php的sdk发送短信 项目地址:https://github.com/newjueqi/ucloudsms 使用方法: (1)在c ...

  3. VM10虚拟机安装图解

    支持32位windows操作系统和64位操作系统的VM10虚拟机 ============= 下载虚拟机: VM10虚拟机下载网址+Vm10的激活秘钥  https://jingyan.baidu.c ...

  4. BZOJ_1085_[SCOI2005]骑士精神_IDDFS

    BZOJ_1085_[SCOI2005]骑士精神_DFS Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可 ...

  5. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  6. Windows上安装配置SSH教程(8)——综合应用:在Windows上使用手动方式实现SSH远程登陆与文件传输

    服务器端操作系统:Windows XP 客户端操作系统:Windows10 安装与配置顺序 1.服务端安装OpenSSH 2.服务端配置OpenSSH 3.客户端安装OpenSSH 4.客户端安装Wi ...

  7. solr6.6 导入索引数据

    1.什么是core core是solr的一个索引库,可以理解为一个数据库,core可以根据需要,创建多个. 2.创建core 例如,创建一个core,名字叫mycore,就可以用一下命令: E:\so ...

  8. 程序设计语言——实践之路 笔记:Beginning

    这本书已经看了不下3遍了,计划在6月写完1,3,6,7,8,9章的笔记. 为什么要写笔记呢,我觉得有这么几个必要: 1.一个概念的首次提出与补充会跨越几个章节,整理在一起有助记忆 2.所有书籍的安排都 ...

  9. Android Gradle基于参数化配置实现差异化构建

    一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...

  10. MySQL 复制 - 性能与扩展性的基石 1:概述及其原理

    1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他服务器保持同步. 接下来,我们将从复制概述及原理.复制的配置. ...