新网创想网站建设,新征程启航

为企业提供网站建设、域名注册、服务器等服务

java使用枚举的原因-创新互联

小编给大家分享一下java使用枚举的原因,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

成都创新互联公司专注于中大型企业的成都做网站、网站制作和网站改版、网站营销服务,追求商业策划与数据分析、创意艺术与技术开发的融合,累计客户数千家,服务满意度达97%。帮助广大客户顺利对接上互联网浪潮,准确优选出符合自己需要的互联网运用,我们将一直专注品牌网站制作和互联网程序开发,在前进的路上,与客户一起成长!

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使用枚举的原因的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联成都网站设计公司行业资讯频道!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:java使用枚举的原因-创新互联
链接地址:http://wjwzjz.com/article/djhgsg.html
在线咨询
服务热线
服务热线:028-86922220
TOP