java中的枚举类和常量类的区别

本文探讨了在软件开发中如何优雅地处理状态判断问题,从硬编码到使用枚举类进行优化的过程,并介绍了枚举类的优势。
链接:https://www.zhihu.com/question/33659578/answer/102108364
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

假如有一笔业务需要审核,审核状态分:未审核,审核中,审核通过,审核不通过。我们在程序里是否可以直接这么写:

if(state==1){//1代表未操作

//操作

}else{

//......

}

将状态标识直接写在代码里面(硬编码),只图一时方便,却是后患无穷,如果有一天你需要修改状态标识,用0代表未审核而不是1,你不得不将所有与该标识相关的代码都找出来一个个改,另外,在编码过程中,标识输入错误的概率是比较高的,一不小心把0输入成了10,虽然不会提示任何编译错误,但运行结果将是出乎人的意料的。

于是我们很快想到可以用常量代替:

publicstaticfinalintUNAUDIT = 0;

相关判断代码则是:

if(state==CONSTANT.UNAUDIT){

//操作

}else{

//......

}

这段代码比硬编码更加健壮容易维护,但是仍然有不足之处。

1、UNAUDIT是编译期常量,如果其值被改变,那么使用方需要重新编译。

2、没有简便的方法获取标识代表的字符串描述。

于是我们用枚举类来代替常量。

publicenum AuditState {

UNAUDIT(1),

AUDITING(2),

AUDIT_SUCCESS(3),

AUDIT_FAIL(4);

privatefinalint statenum;

AuditState(int statenum){

this.statenum = statenum;

}

publicint getStatenum() {

return statenum;

}

}

调用如下:

if (state == AuditState.UNAUDIT.getStatenum()) {

//AuditState.UNAUDIT.toString()获取字符串描述

System.out.println(AuditState.UNAUDIT.toString() + "标识是 "

+ AuditState.UNAUDIT.getStatenum());

} else {

//......

}

枚举类还有更加强大的功能,如添加字段,方法,还可以对他进行遍历访问

### Java 枚举类常量类区别及使用场景 #### 枚举类的特点优势 枚举类型是在Java 5中引入的一种特殊的数据类型,它允许定义一组固定的、具名的常量。枚举本质上是一个特殊的类,继承自`java.lang.Enum`[^1]。这意味着枚举不仅限于简单的名称列表;还可以包含字段、方法甚至实现接口。 - **类型安全性**:由于枚举本身就是一种类型,因此编译器能够提供更强的类型检查支持。 - **丰富的功能**:除了基本的名字外,枚举还能携带额外的信息并拥有自己的行为逻辑。 ```java public enum Color { RED(255, 0, 0), GREEN(0, 255, 0); private final int r; private final int g; private final int b; Color(int red, int green, int blue) { this.r = red; this.g = green; this.b = blue; } public String toString() { return "RGB(" + r + "," + g + "," + b + ")"; } } ``` #### 常量类的设计原则 对于传统的静态常量,则是通过创建一个不可实例化的工具类来保存这些值。为了防止外部创建该类的对象,通常会将构造函数设置为私有的[^5]。这种方式虽然简单直接,但在某些情况下可能不如枚举那样灵活多变。 ```java public class Constants { private Constants() {} // Prevent instantiation public static final String COLOR_RED = "RED"; public static final String COLOR_GREEN = "GREEN"; } ``` #### 使用场景的选择依据 当面对多个相关联但又互斥的状态时,应该优先考虑采用枚举形式表示。而如果只是单纯地存储一些不会改变的基础数值或者字符串,则可以继续沿用常规意义上的静态final变量作为解决方案[^2]。 #### 性能考量 从性能角度来看,在大多数实际应用场景里两者的差异几乎可以忽略不计。然而,考虑到代码维护性扩展性的因素,推荐尽可能多地利用枚举所带来的便利性[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值