java为何要运用罗列?
假定如今有两种定单范例:预订定单和非预订定单。
需求一: 要领submitOrder依据差别定单范例举行差别的处置惩罚。
需求二: 给一个对象: OrderResult设置定单范例。
下面分别用两种罗列体式格局来完成。
int罗列
class IntEnumExample{ private static final PRE_ORDER = 1; private static final NOT_PRE_ORDER = 2; public void submitOrder(int orderType, OrderResult orderResult){ orderResult.setType(orderType); if(orderType == PRE_ORDER){ do something to process preOrder }else if(orderType == NOT_PRE_ORDER){ do something to process other order } } public static void main(String [] args){ IntEnumExample example = new IntEnumExample(); //passing wrong type to the method, however, no compile error and runtime exception here, the bug is hard to be discerned. example.submitOrder(3, orderResult); } }
从上面的例子能够看到,运用int罗列有几个瑕玷:
1.int罗列不做范例搜检,能够给上面的submitOrder要领传入恣意int值
2.代码可读性低,假如没有文档或许源码,不知道给submitOrder通报的值的意义。
不仅如此,就像我之前修正项目中sonar扫描代码发明的题目那样,许多人在运用int罗列时,并没有像上例中将int值定义成static final。假如遗忘定义变量为final则int罗列的值就能够被修正,假如遗忘定义变量为static,就可能涌现运用这个int值时,该int值还没有被初始化好。
总之,会引起bug。
下面来看看运用enum如何做一样的事儿。
class IntEnumExample{ private enum ORDER_TYPE { NOT_PRE_ORDER(1),PRE_ORDER(2); private final int value; private ORDER_TYPE(int value){ this.value = value; } } public void submitOrder(ORDER_TYPE orderType, OrderResult orderResult){ orderResult.setType(orderType); if(orderType == ORDER_TYPE.PRE_ORDER){ do something to process preOrder }else if(orderType == ORDER_TYPE.NOT_PRE_ORDER){ do something to process other order } } public static void main(String [] args){ IntEnumExample example = new IntEnumExample(); //compiler will complain error here, if argument is not the type in the enum. example.submitOrder(ORDER_TYPE.PRE_ORDER, orderResult); } }
经由过程上述代码能够看到,enum很文雅的处理了上一个例子中的题目。
1.编译器将对enum举行范例搜检,范例不符合的编译器会直接报错。
2.比拟与int罗列型直接传int数值的体式格局,enum通报enum范例对象的体式格局,代码可读性更高,通报的罗列范例一览无余。
3.enum范例中的对象自身就是static final的。
主要提醒:
另有一点值得一提的是,假如偶然想给每一个罗列范例给予一个int值,要运用上例中enum定义的体式格局。
private enum ORDER_TYPE { NOT_PRE_ORDER(1),PRE_ORDER(2); private final int value; private ORDER_TYPE(int value){ this.value = value; } }
enum实质也是一个类,所以要领ORDER_TYPE(int value)是这个罗列范例的组织函数,故每一个罗列范例在初始化的时刻须要给组织函数通报相应的值,如: PRE_ORDER(2)。
这类情况下,想得到罗列范例对应的int数值时能够经由过程ORDER_TYPE.PRE_ORDER.value猎取。
零丁提下enum的这类用法是因为,有些人可能会直接运用enum中的ordinal()要领直接完成enum范例与int范例的关联。ordinal()要领返回的是enum范例在被定义时的序数,如ORDER_TYPE.PRE_ORDER.value.ordinal()返回值为0。所以猎取罗列范例对应的int数值貌似也能够经由过程ORDER_TYPE.PRE_ORDER.value.ordinal()+1完成。
不要运用ordinal()要领!不要运用ordinal()要领!不要运用ordinal()要领!主要的事变说三遍,为何?
序数是很不牢靠的东西,序数是能够转变的,假定有一天ORDER_TYPE的定义变了,须要增添几种范例,或许不小心换了NOT_PRE_ORDER和PRE_ORDER定义时的递次,如:
private enum ORDER_TYPE { PRE_ORDER,NOT_PRE_ORDER; }
这时候就会形成很严重的bug,而且不好发明,编译时,运行时都不会有报错。
所以,不要依靠ordianl()要领。
以上就是java为何要运用罗列?的细致内容,更多请关注ki4网别的相干文章!