JAVA枚舉相對來講比.NET的枚舉功能強大,感受就像是一種簡化版的類對象,能夠有構造方法,能夠重載,能夠繼承接口等等,但不能繼承類,JAVA枚舉在實際開發中應用至關頻繁,如下幾個封裝方法在實際開發中可能用到,但願對新手有些幫助。web
首先,新建一個枚舉接口,爲保證全部繼承此接口的枚舉value及description一致,便於開發使用,枚舉統一接口以下。spring
public interface EnumCommon {
public int getValue();
public String getDescription();
}數組
創建測試的枚舉對象,此枚舉繼承上述接口,以下所示:ide
public enum TestEnum implements EnumCommon {
AAA(1, "描述AAA"), BBB(2, "描述BBB"), CCC(3, "描述CCC"), DDD(4, "描述DDD") /*,EEEE8*/;
private int value; //枚舉value字段
private String description; //枚舉描述字段
@Override
public int getValue() {
return value;
}
@Override
public String getDescription() {
return description;
}
//private TestEnum() {}
TestEnum(int value,String description){ //構造初始化賦值
this.description=description;
this.value=value;
}
}工具
創建枚舉時,若是存在沒有value和description的枚舉屬性,必需要有無參構造方法,不定參數的要存在相應不定參數的構造方法。
接下來就到真正的工具方法了,首先一個公用方法,經過方法名稱獲取返回值,以下所示:測試
/**
* 根據反射,經過方法名稱獲取方法值,忽略大小寫的
* @param methodName
* @param obj
* @param args
* @return return value
*/
private static <T> Object getMethodValue(String methodName, T obj,
Object... args) {
Object resut = "";
// boolean isHas = false;
try {
/********************************* start *****************************************/
Method[] methods = obj.getClass().getMethods(); //獲取方法數組,這裏只要共有的方法
if (methods.length <= 0) {
return resut;
}
// String methodstr=Arrays.toString(obj.getClass().getMethods());
// if(methodstr.indexOf(methodName)<0){ //只能粗略判斷若是同時存在 getValue和getValues可能判斷錯誤
// return resut;
// }
// List<Method> methodNamelist=Arrays.asList(methods); //這樣彷佛還要循環取出名稱
Method method = null;
for (int i = 0, len = methods.length; i < len; i++) {
if (methods[i].getName().equalsIgnoreCase(methodName)) { //忽略大小寫取方法
// isHas = true;
methodName = methods[i].getName(); //若是存在,則取出正確的方法名稱
method = methods[i];
break;
}
}
// if(!isHas){
// return resut;
// }
/*************************** end ***********************************************/
// Method method = obj.getClass().getDeclaredMethod(methodName); ///肯定方法
if (method == null) {
return resut;
}
resut = method.invoke(obj, args); //方法執行
if (resut == null) {
resut = "";
}
return resut; //返回結果
} catch (Exception e) {
e.printStackTrace();
}
return resut;
}this
具體的用途註釋已經寫的很清楚了,這裏的不定參數其實沒有用到,從start到end部分的代碼是在進行方法掃描判斷,不想看到那個
NoSuchMethodException異常才這樣弄,若是每次都保證寫的方法名是存在的,能夠直接用那個肯定方法代替上面一堆代碼,或者直接把異常關閉。編碼
下面方法就是要經過value值獲取description值的方法:rest
/**
* 經過value值獲取對應的描述信息
* @param value
* @param enumT
* @param method
* @return enum description
*/
public static <T> Object getEnumDescriotionByValue(Object value,
Class<T> enumT, String... methodNames) {
if (!enumT.isEnum()) { //不是枚舉則返回""
return "";
}
T[] enums = enumT.getEnumConstants(); //獲取枚舉的全部枚舉屬性,彷佛這幾句也沒啥用,通常既然用枚舉,就必定會添加枚舉屬性
if (enums == null || enums.length <= 0) {
return "";
}
int count = methodNames.length;
String valueMathod = "getValue"; //改爲本身的獲取value值的方法名
String desMathod = "getDescription"; //改爲本身的獲取des值得方法名
if (count >= 1 && !"".equals(methodNames[0])) {
valueMathod = methodNames[0];
}
if (count == 2 && !"".equals(methodNames[1])) {
desMathod = methodNames[1];
}
for (int i = 0, len = enums.length; i < len; i++) {
T t = enums[i];
try {
Object resultValue = getMethodValue(valueMathod, t);//獲取枚舉對象value
if (resultValue.toString().equals(value + "")) {
Object resultDes = getMethodValue(desMathod, t); //存在則返回對應描述
return resultDes;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return "";
}orm
參數分別是要獲取value
的值,枚舉的字節碼,是否擴展方法,若是不擴展或者不是自定義,默認的value和description方法爲公共接口的兩個方法,你也能夠自定義獲取其餘方法,那個不定參數,第一個爲value參數對應的方法,第二個爲description對應的自定義方法。你也能夠經過描述獲取value或者獲取其餘。
下面方法爲經過value獲取枚舉的屬性值,大致和上面的方法同樣,就很少說了,直接上代碼。
/**
* 經過枚舉value或者自定義值及方法獲取枚舉屬性值
* @param value
* @param enumT
* @param method
* @return enum key
*/
public static <T> String getEnumKeyByValue(Object value, Class<T> enumT,
String... methodNames) {
if (!enumT.isEnum()) {
return "";
}
T[] enums = enumT.getEnumConstants();
if (enums == null || enums.length <= 0) {
return "";
}
int count = methodNames.length;
String valueMathod = "getValue"; //默認方法
if (count >= 1 && !"".equals(methodNames[0])) { //獨立方法
valueMathod = methodNames[0];
}
for (int i = 0, len = enums.length; i < len; i++) {
T tobj = enums[i];
try {
Object resultValue = getMethodValue(valueMathod, tobj);
if (resultValue != null
&& resultValue.toString().equals(value + "")) { //存在則返回對應值
return tobj + "";
}
} catch (Exception e) {
e.printStackTrace();
}
}
return "";
}
最後一個方式是枚舉轉Map集合,這個在spring MVC web開發自動生成下拉框,,單選框,多選框的時候應用比較方便,代碼以下:
/**
* 枚舉轉map結合value做爲map的key,description做爲map的value
* @param enumT
* @param method
* @return enum mapcolloction
*/
public static <T> Map<Object, String> EnumToMap(Class<T> enumT,
String... methodNames) {
Map<Object, String> enummap = new HashMap<Object, String>();
if (!enumT.isEnum()) {
return enummap;
}
T[] enums = enumT.getEnumConstants();
if (enums == null || enums.length <= 0) {
return enummap;
}
int count = methodNames.length;
String valueMathod = "getValue"; //默認接口value方法
String desMathod = "getDescription";//默認接口description方法
if (count >= 1 && !"".equals(methodNames[0])) { //擴展方法
valueMathod = methodNames[0];
}
if (count == 2 && !"".equals(methodNames[1])) {
desMathod = methodNames[1];
}
for (int i = 0, len = enums.length; i < len; i++) {
T tobj = enums[i];
try {
Object resultValue = getMethodValue(valueMathod, tobj); //獲取value值
if ("".equals(resultValue)) {
continue;
}
Object resultDes = getMethodValue(desMathod, tobj); //獲取description描述值
if ("".equals(resultDes)) { //若是描述不存在獲取屬性值
resultDes = tobj;
}
enummap.put(resultValue, resultDes + "");
} catch (Exception e) {
e.printStackTrace();
}
}
return enummap;
}
代碼的使用方式以下,應該涵蓋了咱們經常使用的枚舉操做:
Class<TestEnum> clasz=TestEnum.class;
Map<Object, String> map=EnumUtil.EnumToMap(clasz);
System.out.println("獲取枚舉的map集合----------:"+map);
String des=(String) EnumUtil.getEnumDescriotionByValue(2, clasz);
System.out.println("獲取值爲2的描述------------:"+des);
Object valueget=EnumUtil.getEnumDescriotionByValue("描述CCC", clasz,"getDescription","getValue");
System.out.println("獲取 描述CCC 的value值-----:"+valueget);
String field=(String) EnumUtil.getEnumKeyByValue(4, clasz);
System.out.println("獲取值爲4的屬性字段--------:"+field);
String fielda=(String) EnumUtil.getEnumKeyByValue("描述AAA", clasz,"getDescription");
System.out.println("獲取 描述AAA 的屬性字段----:"+fielda);
TestEnum str= Enum.valueOf(TestEnum.class,"AAA");
System.out.println("根據字段名稱取值---------:"+ str.getValue());
System.out.println("獲取枚舉全部字段---------:"+ Arrays.toString(TestEnum.values()));
上述運行結果以下圖所示:
springMVC調用綁定方式以下,控制器代碼:
Class<TestEnum> clasz=TestEnum.class;
Map<Object, String> map=EnumUtil.EnumToMap(clasz);
request.setAttribute("restEnum", map);
String returnString="hhhhhh修改了編碼";
return new ModelAndView("test","str",returnString);
經過讀取枚舉返回map集合,前臺頁面代碼以下:
這是map======》》》${restEnum}<br>
<form:form commandName="str">
map下拉框::》》: <form:select path="" items="${restEnum}"/><br><br/><br/><br/><br/>
map單選框::》》: <form:radiobuttons path="" name="enumlistrd" items="${restEnum}" delimiter=" " /><br/>
map多選框::》》: <form:checkboxes items="${restEnum}" path="" name="enumlistck" />
</form:form>
springMVC form表單自動裝載,<form:form commandName="">能夠後臺傳對象,傳入對應與對象字段自動綁定,path屬性能夠是commandName的屬性字段,當存在時,會默認選中。items爲綁定的map集合,效果以下圖所示: