`
wsxhbusbanana
  • 浏览: 32913 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java Enum 枚举帮助类,根据值或者名称获取枚举类型对象

    博客分类:
  • j2EE
阅读更多

    讲真,java的枚举类提供的方法太少了,Enum只有两个valueOf可以搞,如果碰上需要传入枚举类型的值,获取枚举类对象或者枚举类型名称的时候,只能干瞪眼,或者循环比对。最近项目就遇到这种,而且感觉以后以及别人都不会少遇到,所以就写了个帮助类,希望以后能用上吧。这个帮助类是基于以下枚举类的类型提供的:

 

 

public enum DeleteStatusEnum {
	/**
	 * 值为0(就是NOT_DELETE)是数据库默认值,未删除;
	 * 值为1(就是HAS_DELETE)是已经被逻辑删除了
	 */
	NOT_DELETE("未删除","0"),
	HAS_DELETE("已删除","1");
	
	private String typeName;
	private String typeCode;
	
	private DeleteStatusEnum(String typeName,String typeCode){
		this.typeName = typeName;
		this.typeCode = typeCode;
	}

	public String getTypeName() {
		return typeName;
	}

	public void setTypeName(String typeName) {
		this.typeName = typeName;
	}

	public String getTypeCode() {
		return typeCode;
	}

	public void setTypeCode(String typeCode) {
		this.typeCode = typeCode;
	}
}

 帮助类的内容:

package com.hikvision.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * 此帮助类严格限定为有typeName和typeCode的枚举类,如定义枚举类型为 ADMIN(typeName,typeCode)这种
 * 
 * ClassName: EnumOperatorUtil.java 
 * Copyright xiehao 
 * Function: TODO ADD FUNCTION.
 * Reason: TODO ADD REASON.
 * Date:   2017年2月28日
 * @author   xiehao 
 * @version  V1.0
 * @since    JDK 1.8
 * @see
 */
public class EnumHelperUtil{
	/**
	 * indexOf,传入的参数ordinal指的是需要的枚举值在设定的枚举类中的顺序,以0开始
	 * T
	 * @param clazz
	 * @param ordinal
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T indexOf(Class<T> clazz, int ordinal){
		return (T) clazz.getEnumConstants()[ordinal];
	}
	/**
	 * nameOf,传入的参数name指的是枚举值的名称,一般是大写加下划线的
	 * T
	 * @param clazz
	 * @param name
	 * @return Enum T
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T nameOf(Class<T> clazz, String name){
		
		return (T) Enum.valueOf(clazz, name);
	}
	/**
	 * 使用枚举类型对应的typeCode获取枚举类型
	 * T
	 * @param clazz    枚举类的class
	 * @param getTypeCodeMethodName  传入的typeCode的get方法
	 * @param typeCode  传入的typeCode值,这个方法为String类型
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T getByStringTypeCode(Class<T> clazz,String getTypeCodeMethodName, String typeCode){
		T result = null;
		try{
			T[] arr = clazz.getEnumConstants();
			Method targetMethod = clazz.getDeclaredMethod(getTypeCodeMethodName);
			String typeCodeVal = null;
			for(T entity:arr){
				typeCodeVal = targetMethod.invoke(entity).toString();
				if(typeCodeVal.contentEquals(typeCode)){
					result = entity;
					break;
				}
			}			
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 使用枚举类型对应的typeCode获取枚举类型
	 * T
	 * @param clazz    枚举类的class
	 * @param getTypeCodeMethodName  传入的typeCode的get方法
	 * @param typeCode  传入的typeCode值,这个方法为Integer类型
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T getByIntegerTypeCode(Class<T> clazz,String getTypeCodeMethodName, Integer typeCode){
		T result = null;
		try{
			T[] arr = clazz.getEnumConstants();
			Method targetMethod = clazz.getDeclaredMethod(getTypeCodeMethodName);
			Integer typeCodeVal = null;
			for(T entity:arr){
				typeCodeVal = Integer.valueOf(targetMethod.invoke(entity).toString());
				if(typeCodeVal.equals(typeCode)){
					result = entity;
					break;
				}
			}			
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return result;
	}
	/**
	 * 使用枚举类型对应的typeName获取枚举类型
	 * T
	 * @param clazz   枚举类的class 
	 * @param getTypeNameMethodName  传入的typeName的get方法
	 * @param typeName 传入的typeName值,这个方法为String类型
	 * @return
	 * @author   xiehao 
	 */
	public static <T extends Enum<T>> T getByStringTypeName(Class<T> clazz,String getTypeNameMethodName, String typeName){
		T result = null;
		try{
			T[] arr = clazz.getEnumConstants();
			Method targetMethod = clazz.getDeclaredMethod(getTypeNameMethodName);
			String typeNameVal = null;
			for(T entity:arr){
				typeNameVal = targetMethod.invoke(entity).toString();
				if(typeNameVal.contentEquals(typeName)){
					result = entity;
					break;
				}
			}			
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return result;
	}
}

 以上内容其实还可以再精简优化,时间有限,就先记录下来吧

分享到:
评论

相关推荐

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    这些代码可能包括创建枚举类,然后通过反射获取枚举值、实例名以及演示如何使用`getDeclaredConstructor()`和`newInstance()`方法来访问私有构造函数(虽然这不是常规用法)。 通过深入理解这些概念,你可以更好地...

    Java枚举类型Enum的用法

    在枚举内部,可以通过`Enum&lt;E extends Enum&lt;E&gt;&gt;`的泛型方法`getDeclaringClass()`获取枚举常量所属的枚举类,以及`name()`和`ordinal()`方法获取常量的名称和在枚举中的位置。 总结来说,Java枚举类型提供了一种...

    java中enum枚举的详细用法

    可以通过`values()`方法获取枚举类型的所有实例,然后进行遍历: ```java for (WeekDay day : WeekDay.values()) { System.out.println(day + "====&gt;" + day.getDay()); } ``` 这将打印出所有枚举实例及其...

    Java中怎样由枚举常量的ordinal值获得枚举常量对象

    Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方  enum Season {  SPRING, SUMMER, AUTUMN, WINTER  }  定义了一个季节枚举类型。  在本例中,对于Season.SPRING这个...

    enum枚举类的应用

    包含了关于枚举类的应用,以及枚举类和接口的组合应用,扩展映射关系。很有用的工具类。

    JAVA高级编程中Enum枚举

    在Java编程语言中,`Enum`(枚举)是一种特殊的类类型,用于定义固定的、预定义的常量集合。它们在程序设计中扮演着重要的角色,特别是在需要表示一组固定值时,如状态、颜色、星期等。本资源包提供了一些关于`Enum`...

    java enum枚举教程学习资料

    Java枚举(enum)是Java语言提供的一种特殊的数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中是类的子类型,因此,它们具备类的一些特性,比如可以有方法、变量以及实现接口。...

    java枚举类型enum的使用

    4. **`valueOf()`**:根据枚举元素的名称获取枚举对象实例。 ##### 3.1 枚举遍历示例 下面是一个简单的枚举遍历示例: ```java public static void testTraversalEnum() { Light[] allLight = Light.values(); ...

    java enum 枚举的spring boot2.x完美实现demo源码

    在Spring Boot的配置或服务中,枚举还可以用来实现更复杂的逻辑,例如通过枚举值进行条件判断、映射到其他数据结构等。 在实际项目中,`pom.xml`文件包含了项目依赖管理,确保你引入了Spring Boot的启动器和其他...

    简单总结java枚举类型

    Java枚举类型是Java语言中一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的方式来表示一组有限的值。枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用...

    Java中的“枚举类型

    - **增强可读性**:通过`name()`方法获取枚举元素的名称,使得代码更具可读性,便于维护。 **4. 设计哲学** 枚举不仅是Java语法的一部分,更是一种设计理念的体现。它鼓励开发者在设计程序时,明确区分不同类型的...

    enum枚举类的一些代码demo

    在Java编程语言中,`enum`(枚举)是一种特殊的类,用于定义一组固定的常量。枚举在很多场景下非常有用,例如表示状态、颜色、星期等有限且不变的集合。下面我们将深入探讨`enum`枚举类的使用方法,并通过具体的代码...

    解析字符串转化为对象+code转desc+通过值实例枚举类+EnumUtil+PackageUtils工具类

    解析字符串转化为对象+code转desc+通过值实例枚举类+EnumUtil+PackageUtils工具类 ZipInputStream实现压缩文件的读取与数据转化的过程,利用反射实现根据枚举值获取枚举对象。

    java枚举类用法

    Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...

    javaenum(枚举)使用详解+总结.pdf

    枚举可以方便地进行遍历,常通过`values()`方法获取枚举值的数组: ```java for (Color color : Color.values()) { System.out.println(color); } ``` 同时,枚举常量也可以用于`switch`语句,提供了一种更...

    java 枚举(enum) 详解(学习资料)

    可以通过 `values()` 方法获取枚举类型的全部枚举常量,返回一个枚举类型的数组。 总结来说,Java 枚举提供了一种强类型、安全且易于使用的机制,用于表示一组固定数量的值。它简化了代码,提高了程序的可读性和可...

    56个民族枚举类

    枚举是面向对象编程中的一种数据类型,它允许我们定义一组有限的常量,这些常量代表了特定的值。在这个上下文中,这个枚举类可能是用来存储每个民族的名称、代码或者其他相关信息,便于在程序中进行处理和操作。 ...

    理解java枚举类型

    Java枚举类型是Java语言中的一种特殊的类,用于定义一组固定的常量集合。它在Java中扮演着重要的角色,提供了一种安全、类型化的常量表示方式,比传统的final static变量更具有优势。理解Java枚举类型对于编写高质量...

    Java enum的用法详解

    在Java编程语言中,`enum`(枚举)是一种特殊的类,用于定义一组固定的常量。这个特性在很多场合下非常有用,比如表示状态、角色、颜色等有限且不变的集合。本文将深入探讨Java `enum`的用法,包括其基本概念、创建...

    用enum实现单例模式的方法来读取配置文件

    本篇将详细介绍如何利用枚举(enum)来实现单例模式,并结合`Properties`类解析配置文件。 首先,我们来看一下传统的单例模式实现方式,如懒汉式和饿汉式,但这些方法在多线程环境下可能会存在问题。而使用枚举实现...

Global site tag (gtag.js) - Google Analytics