java枚举的好处,枚举用法java

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: