围绕JAVA中的常量主题似乎存在很多混淆,有的人使用整数或字符串来定义常量,而有的人则使用枚举。
我还遇到了在自己的接口中定义的常量 —— 使用常量的类必须实现接口。该策略通常被称为界面常量设计模式。
在本文中,我们将介绍在Java中存储常量的两种最常见的策略: 整数和枚举。
假设我们有一个表示在线商店中的订单的类,我们希望跟踪订单发生的一周中的哪一天。
请注意,该类目前不会编译 - [datatype]只是我们将使用的常量类型的占位符。
在Java中定义常量的最常用方法之一是通过整数,其中整数变量是静态的。
定义整数常量时要注意的第一个问题是放置它们的位置。我们是直接将它们直接放在Order类中?还是给他们自己的Class呢?
由于days非常普遍,而且不一定只连接到Order类型的对象,所以我们将在它们自己的类WeekDay中定义它们。
您可能注意到了私有构造函数——这是为了避免客户机实例化类。该类只包含静态变量,这些变量不绑定到对象,因此不需要实例化该类。
现在,每当我们需要设定某一天的订单,我们可以这样做:
当我们想检查星期五的一个订单时,我们可以简单地调用write:
那么。这个设计就不会有问题了吗?
假设你一年后来看这个代码,要查看周一的订单,但你忘记了WeekDay的类,这时候你可以尝试这样做:
星期一是一周的第一天,所以工作日应该是1,对吧?
但事实并非如此,因为静态int变量Monday在我们的工作日类中被定义为0 !
这是一个很好的例子,说明了为什么应该避免使用整数常量。它们很容易出错,容易混淆,而且很难调试。
在Java中定义常量的另一种方法是使用枚举。
当使用枚举时,我们的constants类是这样的:
注意,没有私有构造函数——程序员(您!)没有必要强制类是不可实例化的,因为枚举在默认情况下是不可实例化的!
将WeekDay设置为一个顺序的语法与整型常量完全相同:
同样,我们也可以处理周五的订单:
然而,关键的区别在于,这是在Order类中设置和比较WeekDay变量值的唯一方法。
order.setWeekDay (1)和(order.getWeekDay() == 1)将使编译器抛出一个错误,因为您试图使用integer类型的变量,而它们应该是WeekDay类型的变量!
对于枚举,这不再是一个问题。如果您试图使用整数而不是WeekDay枚举的成员,编译器只会抛出一个错误,告诉您需要使用WeekDay枚举。
换句话说,唯一能帮你检查周五是否有订单的方法是:
您不再需要记住constants类,如果有客户端要使用您的代码,他们也不必担心。
希望这个例子向您展示了为什么在定义常量时应该始终优先使用枚举而不是整数。枚举将使您的代码更不容易出错、更易于阅读和更易于维护!
如果在JAVA学习上遇见不会的,或者想学Java的,私信我交流!
一个小提示:如果您希望扩展您的Java技能并成为一名高级Java开发人员,我强烈建议您购买一本由Joshua Bloch编写的最畅销的有效Java !