专业的JAVA编程教程与资源

网站首页 > java教程 正文

java基础之枚举,都有常量了,为啥还要用枚举?

temp10 2024-09-25 21:10:33 java教程 8 ℃ 0 评论

当我们需要使用一些固定不变的数据时,就可以将其声明为静态常量以方便复用。

例如,在开发过程中,我曾遇到了一个需求:定义春夏秋冬四季。面对这个需求,我选择用int数字表示四季,春天为1,夏天为2,以此类推。

java基础之枚举,都有常量了,为啥还要用枚举?

当然,这只是一种选择,你也可以用字符串等其他类型表示,这个看自己的具体需求。

一旦静态常量定义好后,我们就可以直接通过类名调用它们,这大大简化了代码的复杂性并提高了可读性。

静态常量的局限性

尽管静态常量使用起来很方便,但它们也有一定的局限性。比如你定义一个方法用来接收世界的数值,然后根据不同数值执行不同的逻辑。

这种情况下,你会发现你没有办法限制调用者传什么值进来。他们可以按照常量的范围传递1234,也可以传递5678。

最主要的是,你没有办法有效的让调用者直观感受应该传什么值,因为你的参数只是int类型,这意味着任何int数值都是合法的。

当然,你可以在方法注释上写清楚数值范围,也可以说明要用常量,还可以对意外数值进行逻辑处理,但这些做法都增加了调用者的心智负担,并不是一个好的设计。

枚举的引入和优势

为了更好的提示调用者或者说更好的限制调用者,我们可以改进一下。

我们将之前的int常量改为自定义的季节类型。为了进一步增强安全性,我将类声明为final以防继承构造,方法声明为private以防止外部实例化。这样,我就能保证在程序内季节类型的对象只会有这几个常量。然后,方法参数就可以改为季节类型了。

这样的改动使得调用者只能传递你定义好的常量,他们最多只能额外传递一个null值。如果尝试传递其他类型的值,编译器就会直接报错。我们通过这种设计就做到了,在没有任何额外说明和额外逻辑的情况下,限制住了调用者传递的内容。对于调用者来说,他也能非常直观的理解这个方法的参数限制。恭喜你,你已经发明了枚举,这种设计就是枚举的原理。

我们可以使用枚举更方便的来满足之前的操作。在Java中用enum关键字来声明枚举,然后就可以直接定义枚举值了。

调用时和静态常量一样都非常方便,同时枚举本身就是一种类型,所以天然的就限制了调用者能够传递的数据类型。并且枚举值还可以使用switch来判断,这使得在处理多种情况时更加方便。

枚举的进阶应用与编程实践

将枚举反编译之后,就可以发现和我们之前的设计基本一致,并且和普通的class也没有太大的区别,只是它继承了enum父类,并从父类中继承下来了一些方法可供使用。

需要注意的是,enum父类我们无法手动继承,只能通过使用enum关键字来定义枚举。这是Java的语法规定。

最后总结一下,枚举能够很好地帮助我们限定语义,能够在编译阶段就检查每个值的合理性,并且可以用于switch判断以及自带了多个方法提供使用,这使得枚举比普通的常量更加方便。当然,并不是说必须得使用枚举常量,在许多场景下都非常合适。程序员应根据自己的实际情况来选择合适的数据类型。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表