枚举常量化工具

场景

在部分场景中会用到一些枚举类,并且到查询数据时,与枚举有对应关系
比如数据库会出现 字段 "1" 代表"完成" ”0"代表"未完成" 的类似数据
那从数据库查询出这些数据的时候,数据拿给前端或者导出文件是需要显示原意的,即 未完成 或者 完成,而不是显示 0 或 1

在后端查出数据库的数据,然后找到对应含义值,是很常见的,
但是常常写,会有一些问题,不免思考有什么好方法优化一下

问题

获取映射值繁琐

每次查询,都要找到枚举类获取对应值,查询次数多了就显得低效(代码执行总得消耗CPU,这里消耗一些,那里消耗一些,加起来程序运行可能就变慢了)

可能缺失映射值

如果数据异常找不到映射值怎么办,或者数据更新枚举类没有更新怎么办(比如 0 1 有代表"未完成" 和 "完成",现在加一个 2 代表 ”进行中" ,但是枚举类没有更新)

工具类实现

编写一个工具类解决上面提到的两个问题,使在业务开发中更高效方便

package com.test;

import java.util.Map;

import java.util.HashMap;
/**
* 枚举映射工具类
* @author narule
* @version 创建时间:2019年8月22日 下午7:35:57 
*/
@SuppressWarnings("all")
public class MappingUtils <K,V> {

	private Map<K,V> map;
	
	private MappingUtils(Map<K,V> map){
		this.map = map;
	}
	
	private MappingUtils(){
		this.map = new HashMap<K,V>();
	}
	
	/** 
	*针对缺失映射值的一种设计方案
	*/
	public Object get(K key) {
		Object value;
		return (value = map.get(key)) != null ? value : key; 
		//比如在excel 导出时 如果出现 key = 2 没有 对应value, 应该返回 2,不应该返回null,返回null导致表数据缺失
	}
	
 	public V put(K key,V value) {
		return map.put(key, value);
	} 
	
	private Map<K, V> getMap(){
		return this.map;
	}
	/**
	* 
	*/
	private static final long serialVersionUID = 1L;


	/**物资种类 MaterialTypeEnum*/
	public final static MappingUtils<String,String> MATERIAL_TYPE = new MappingUtils();
	
	
	/*
	*这里是解决获取映射值的繁琐的一种方案,类加载时就将枚举映射关系存入map
	*/
	static {
                // 枚举常量化 - 放入map   后面多次获取映射值时会提高代码效率和简单性
		MaterialTypeEnum[] materialTypeEnums = MaterialTypeEnum.values();
		for (MaterialTypeEnum materialTypeEnum : materialTypeEnums) {
			MATERIAL_TYPE.put(materialTypeEnum.getKey(), materialTypeEnum.getValue());
		}
		MATERIAL_TYPE.put(null, "其他"); //针对key为null的处理
	}
	
	public static void main(String[] args) {
		System.out.println(MATERIAL_TYPE.get("90"));
		System.out.println(MATERIAL_TYPE.get("1"));
	}

}
posted @ 2019-08-28 11:57  楠予  阅读(240)  评论(0编辑  收藏  举报