网站首页 > java教程 正文
当我们需要使用一些固定不变的数据时,就可以将其声明为静态常量以方便复用。
例如,在开发过程中,我曾遇到了一个需求:定义春夏秋冬四季。面对这个需求,我选择用int数字表示四季,春天为1,夏天为2,以此类推。
当然,这只是一种选择,你也可以用字符串等其他类型表示,这个看自己的具体需求。
一旦静态常量定义好后,我们就可以直接通过类名调用它们,这大大简化了代码的复杂性并提高了可读性。
静态常量的局限性
尽管静态常量使用起来很方便,但它们也有一定的局限性。比如你定义一个方法用来接收世界的数值,然后根据不同数值执行不同的逻辑。
这种情况下,你会发现你没有办法限制调用者传什么值进来。他们可以按照常量的范围传递1234,也可以传递5678。
最主要的是,你没有办法有效的让调用者直观感受应该传什么值,因为你的参数只是int类型,这意味着任何int数值都是合法的。
当然,你可以在方法注释上写清楚数值范围,也可以说明要用常量,还可以对意外数值进行逻辑处理,但这些做法都增加了调用者的心智负担,并不是一个好的设计。
枚举的引入和优势
为了更好的提示调用者或者说更好的限制调用者,我们可以改进一下。
我们将之前的int常量改为自定义的季节类型。为了进一步增强安全性,我将类声明为final以防继承构造,方法声明为private以防止外部实例化。这样,我就能保证在程序内季节类型的对象只会有这几个常量。然后,方法参数就可以改为季节类型了。
这样的改动使得调用者只能传递你定义好的常量,他们最多只能额外传递一个null值。如果尝试传递其他类型的值,编译器就会直接报错。我们通过这种设计就做到了,在没有任何额外说明和额外逻辑的情况下,限制住了调用者传递的内容。对于调用者来说,他也能非常直观的理解这个方法的参数限制。恭喜你,你已经发明了枚举,这种设计就是枚举的原理。
我们可以使用枚举更方便的来满足之前的操作。在Java中用enum关键字来声明枚举,然后就可以直接定义枚举值了。
调用时和静态常量一样都非常方便,同时枚举本身就是一种类型,所以天然的就限制了调用者能够传递的数据类型。并且枚举值还可以使用switch来判断,这使得在处理多种情况时更加方便。
枚举的进阶应用与编程实践
将枚举反编译之后,就可以发现和我们之前的设计基本一致,并且和普通的class也没有太大的区别,只是它继承了enum父类,并从父类中继承下来了一些方法可供使用。
需要注意的是,enum父类我们无法手动继承,只能通过使用enum关键字来定义枚举。这是Java的语法规定。
最后总结一下,枚举能够很好地帮助我们限定语义,能够在编译阶段就检查每个值的合理性,并且可以用于switch判断以及自带了多个方法提供使用,这使得枚举比普通的常量更加方便。当然,并不是说必须得使用枚举常量,在许多场景下都非常合适。程序员应根据自己的实际情况来选择合适的数据类型。
猜你喜欢
- 2024-09-25 Java枚举类型的应用(java 枚举类型)
- 2024-09-25 每个Java开发人员应该了解关于枚举的18点特性
- 2024-09-25 三十三、Java内部类与枚举(java内部类的使用场景)
- 2024-09-25 反射、枚举以及Lambda表达式(反射forname)
- 2024-09-25 尚学堂知识整理:java 枚举类型(java中的枚举是什么意思)
- 2024-09-25 实际工作中推荐使用java枚举类型,提高开发效率#编程
- 2024-09-25 java枚举enumeration(java枚举类使用场景)
- 2024-09-25 你所不知道的JAVA枚举(Enum)的使用
- 2024-09-25 Java枚举的高级用法之多键值的映射使用
- 2024-09-25 深圳尚学堂Java培训:Java枚举的七种常见用法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)