前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用好Java中的枚举真的没有那么简单(1)

用好Java中的枚举真的没有那么简单(1)

作者头像
黑洞代码
发布2021-01-14 15:02:44
4850
发布2021-01-14 15:02:44
举报

enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承java.lang.Enum类。

枚举在很多时候会和常量拿来对比,可能因为本身我们大量实际使用枚举的地方就是为了替代常量。那么这种方式由什么优势呢?

以这种方式定义的常量使代码更具可读性,允许进行编译时检查,预先记录可接受值的列表,并避免由于传入无效值而引起的意外行为。

下面示例定义一个简单的枚举类型 pizza 订单的状态,共有三种 ORDERED, READY, DELIVERED状态:

代码语言:javascript
复制
package com.jesper.seckill.config;

public class Test {
    public enum PizzaStatus {
        ORDERED,
        READY,
        DELIVERED;
    }

    public static void main(String[] args) {
        // ORDERED
        System.out.println(PizzaStatus.ORDERED.name());
        // ORDERED
        System.out.println(PizzaStatus.ORDERED);
        // class java.lang.String
        System.out.println(PizzaStatus.ORDERED.name().getClass());
        // class com.jesper.seckill.config.Test$PizzaStatus
        System.out.println(PizzaStatus.ORDERED.getClass());
    }
}

简单来说,我们通过上面的代码避免了定义常量,我们将所有和 pizza 订单的状态的常量都统一放到了一个枚举类型里面。

使用 == 比较枚举类型

由于枚举类型确保JVM中仅存在一个常量实例,因此我们可以安全地使用 == 运算符比较两个变量,如上例所示;此外,== 运算符可提供编译时和运行时的安全性。

首先,让我们看一下以下代码段中的运行时安全性,其中 == 运算符用于比较状态,并且如果两个值均为null 都不会引发 NullPointerException。相反,如果使用equals方法,将抛出 NullPointerException:

代码语言:javascript
复制
if(testPz.getStatus().equals(Pizza.PizzaStatus.DELIVERED)); 
if(testPz.getStatus() == Pizza.PizzaStatus.DELIVERED);

对于编译时安全性,我们看另一个示例,两个不同枚举类型进行比较,使用equal方法比较结果确定为true,因为getStatus方法的枚举值与另一个类型枚举值一致,但逻辑上应该为false。这个问题可以使用==操作符避免。因为编译器会表示类型不兼容错误:

代码语言:javascript
复制
if(testPz.getStatus().equals(TestColor.GREEN));
if(testPz.getStatus() == TestColor.GREEN);

在 switch 语句中使用枚举类型

代码语言:javascript
复制
public int getDeliveryTimeInDays() {
    switch (status) {
        case ORDERED:
            return 5;
        case READY:
            return 2;
        case DELIVERED:
            return 0;
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 == 比较枚举类型
  • 在 switch 语句中使用枚举类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档