java枚举的好处,枚举用法java
最近发现公司的代码里有很多用int枚举的方式,也看到了一些用enum枚举的方式。出于对此的好奇,我做了一个研究,估算了一下这篇文章的摘要,并解释了我为什么使用enum。
如何解决写爬虫IP受阻的问题?立即使用。
java为什么要使用枚举?
现在假设有两种订单:预约订单和非预约订单。
需求1:方法submitOrder根据不同的订单类型进行不同的处理。
需求2:设置对象的订单类型:OrderResult。
下面分别用两种枚举方式来实现。
int枚举
类别意图示例{
私有静态final PRE _ ORDER=1;
私有静态final NOT _ PRE _ ORDER=2;
public void submit order(int order type,OrderResult orderResult){
orderResult.setType(订单类型);
if(orderType==PRE_ORDER){
做一些事情来处理预订
} else if(ORDER type==NOT _ PRE _ ORDER){
做些事情来处理其他订单
}
}
公共静态void main(String [] args){
IntEnumExample example=new IntEnumExample();
//将错误的类型传递给方法,但是这里没有编译错误和运行时异常,错误很难被发现。
example.submitOrder(3,order result);
}
}从上面的例子可以看出,使用int枚举有几个缺点:
int枚举不做类型检查,您可以将任何int值传递给上面的submitOrder方法。
2.代码可读性低。如果没有文档或者源代码,我不知道传递给submitOrder的值是什么意思。
更有甚者,就像我之前在项目中修改声纳扫描代码时发现的问题,很多人在使用int枚举时并没有像上例那样将int值定义为static final。如果忘记将变量定义为final,可以修改int枚举的值。如果您忘记将变量定义为static,那么当您使用它时,int值可能不会被初始化。
总之会造成bug。
下面来看看使用enum如何做同样的事儿。
类别意图示例{
私有枚举ORDER_TYPE {
NOT_PRE_ORDER(1),PRE _ ORDER(2);
私有最终int值;
私人订单类型(整数值){
this.value=value
}
}
public void submit ORDER(ORDER _ TYPE ORDER TYPE,OrderResult orderResult){
orderResult.setType(订单类型);
if(orderType==ORDER_TYPE。预购){
做一些事情来处理预订
}else if(orderType==ORDER_TYPE。NOT_PRE_ORDER){
做些事情来处理其他订单
}
}
公共静态void main(String [] args){
IntEnumExample example=new IntEnumExample();
//如果参数不是枚举中的类型,编译器将在此报错。
example.submitOrder(ORDER_TYPE。PRE_ORDER,ORDER result);
}
}从上面的代码可以看出,enum优雅地解决了上例中的问题。
1.编译器会检查枚举的类型,类型不符合的编译器会直接报错。
2.与直接用int枚举类型传递int值的方法相比,用enum传递enum类型对象的方法代码可读性更高,传递的枚举类型一目了然。
3.3.enum类型中的对象本身是静态final。
重要提示:
另外值得一提的是,如果你有时想给每个枚举类型赋一个int值,你应该使用上面例子中enum定义的方法。
私有枚举ORDER_TYPE {
NOT_PRE_ORDER(1),PRE _ ORDER(2);
私有最终int值;
私人订单类型(整数值){
this.value=value
}
}enum本质上也是一个类,所以方法ORDER_TYPE(int value)就是这个枚举类型的构造函数。所以每个枚举类型在初始化时都需要将响应值传递给构造函数,比如:PRE_ORDER(2)。
这种情况下,可以通过order _ type.pre _ order.value得到枚举类型对应的int值。
单独提到enum的这种用法,是因为有些人可能会直接使用enum中的ordinal()方法,直接实现enum类型和int类型的关联。ordinal()方法在定义时返回枚举类型的序数,如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定义的顺序不小心发生了变化,比如:
私有枚举ORDER_TYPE {
PRE_ORDER,而不是_ PRE _ ORDER
}这时候就会造成非常严重的bug,而且不容易发现。编译时,运行时不会有错误。
所以,不要依赖ordianl()方法。
这就是java使用枚举的原因。更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。