java 关于枚举类的一个问题?

原文链接:https://cloud.tencent.com/dev...


这是自定义异常的实现方式,中间有一步是创建了一个接口,然后创建一个枚举类去实现接口。

请问这么写有什么好处呢?为什么不直接写枚举类出来?请大神指教,谢谢!

阅读 2.5k
2 个回答

你好,这个问题确实比较有意思哈。我想我可以以我的理解来稍作解释。
首先,用枚举来实现这个ErrorCode接口,那么这个枚举类中的每个枚举就相当于这个接口的实现类。
正如你所贴的链接的文章末尾的代码:

try {
          //......
        }catch (Exception e){
           //......
           //抛出自定义异常
            throw new BusinessException(CommonErrorCode.E_100102);
        }

当给BusinessException的构造方法传入一个具体的枚举时,那么BusinessException中的ErrorCode属性就能够初始化为该枚举。我们当然也可以省去这个属性直接在BusinessException中声明一个CommonErrorCode的属性,然后初始化的时候也可以给它赋值,但怎么说呢,这样就破坏了封装的优雅性,因为我们在BusinessException中只想要这些枚举的行为,而不是具体的什么枚举内容,那么把这些行为封装到一个接口中时就变得清晰和易于使用,当别人或别的代码来调用用你的BusinessException时也会减少与枚举的直接接触,减少了 耦合。
我讲的可能不是很好,我觉得可以把这个事情看成是每一个枚举都是接口的实现类,从这个角度或者能把问题看的清晰一些。

BusinessException 可以通过一个 ErrorCode 来构造,至于这个 ErrorCode 是某个具体的类,还是枚举类,无所谓,反正主要是要用它的 getCode()getDesc()

然后系统内部需要预定义一些错误对象,显示用枚举类来定义是最省事的办法,毕竟写 E_100101(100101, "") 比写 new CommonErrorCode(100101, "") 要少写不少字。

但是,如果用户代码需要自定义错误呢?显示用户代码不会去扩展 CommonErrorCode(假设已经封装在包中),也不应该直接去修改。那么用户可以定义自己的错误消息类 CustomErrorCode implments ErrorCode。如果用户的错误类型比较多,也可以定义成另一个实现了 ErrorCode 的枚举类。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏