建议速读 | Java 常量定义的正确姿势!

简介: 在 Java 中,关于常量的话题似乎有很多困惑。有些人使用整数或字符串来定义常量,而另一些人则使用枚举。我还遇到了在其自己的接口中定义的常量,使用该常量的类必须实现该接口。这种策略通常称为接口常量设计模式。

在 Java 中,关于常量的话题似乎有很多困惑。有些人使用整数或字符串来定义常量,而另一些人则使用枚举。我还遇到了在其自己的接口中定义的常量,使用该常量的类必须实现该接口。这种策略通常称为接口常量设计模式。


在这篇文章里,我会介绍在 Java 中存储常量的两种最常见的策略:整数枚举。首先,无论何时决定使用常量,都应确保常量不会随时间变化,因此可以避免重新编译。


场景


我们选用一个非常常见的关于常量的例子:Weekday


假定我们在线商店中有一个代表订单 Order 的类,我们希望在其中跟踪订单在一周的哪一天发生。


我们的类看起来像这样:


public class Order {    private [datatype] weekDay;    public [datatype] getWeekDay() {        return weekDay;    }    public void setWeekDay([datatype] weekDay) {        this.weekDay = weekDay;    }}


请注意,该类暂时无法编译,datatype 只是我们将要使用的常量类型的占位符。


用整数定义常量


在 Java 中定义常量的最常见方法之一是使用整数,其中整数变量使用 static final 修饰。


public static final int MONDAY = 0;public static final int TUESDAY = 1;public static final int WEDNESDAY = 2;public static final int THURSDAY = 3;public static final int FRIDAY = 4;public static final int SATURDAY = 5;public static final int SUNDAY = 6;


定义整数常量时,我们要考虑的第一个问题是将它们放在哪里。我们是否将它们直接放置在 Order 类中?还是我们将它们放在一个单独的类中。


由于 Weekday 不一定只应用到 Order 类型的对象中,因此我们在一个单独的类 Weekday 中定义它们。


public class WeekDay {    private WeekDay() {}    public static final int MONDAY = 0;    public static final int TUESDAY = 1;    public static final int WEDNESDAY = 2;    public static final int THURSDAY = 3;    public static final int FRIDAY = 4;    public static final int SATURDAY = 5;    public static final int SUNDAY = 6;}


你可能注意到了私有构造函数,这是为了避免客户端实例化该类。该类仅包含不与对象绑定的静态变量,因此无需实例化该类。


现在,每当需要为 Order 设置特定的日期时,我们可以这样操作:


Order order = new Order();order.setWeekDay(WeekDay.MONDAY);


当我们要检查订单是否在星期五发生时,我们可以简单地调用 getter 方法:


if (order.getWeekDay() == WeekDay.FRIDAY) {}


到目前为止,一切都很好。这种设计看起来似乎没有任何问题。


好吧,假设你在一年后再次回到此代码,并且你必须检查是否在星期一下了订单。你可能完全忘记了 Weekday 这个类(不排除这种可能)...


在这种情况下,你可以尝试如下操作:


if (order.getWeekDay() == 1) {}


完全忘记了 WeekDay 类,此代码非常合理。星期一是一周的第一天,所以工作日应该是 1,对吗?但是不,不是,因为在我们的 Weekday 类中静态 int 变量 Monday 被定义为 0!


这是为什么你应该考虑避免使用整数常量的一个很好的例子。它们容易出错,混乱并且难以调试


用枚举定义常量


在 Java 中定义常量的另一种方法是使用枚举。


使用枚举时,常量类将如下所示:


public enum WeekDay {    MONDAY,    TUESDAY,    WEDNESDAY,    THURSDAY,    FRIDAY,    SATURDAY,    SUNDAY}


请注意,这里没有私有构造函数,你也无需强制该类是不可实例化的,因为默认情况下枚举是不可实例化的


给 Order 设置 WeekDay 的语法与使用整数常量的语法完全相同:


order.setWeekDay(WeekDay.MONDAY);


我们是否可以在星期五处理订单方面也没有区别:


if (order.getWeekDay() == WeekDay.FRIDAY) {}


但是,主要区别在于:这是你可以在 Order 类中设置和比较 weekday 变量的值的唯一方法


若你使用 order.setWeekDay(1);if(order.getWeekDay()== 1),将使编译器抛出错误,因为当你尝试使用整型类型的变量时,它们应为 WeekDay 类型!


回想一下你完全忘记了 “WeekDay” 常量类的情况。对于枚举,这不再是问题!如果你尝试使用整数代替 WeekDay 枚举的成员,则编译器将简单地引发一个错误,告诉你需要使用 WeekDay 枚举。


换句话说,检查订单是否在星期五发生的唯一方式是:


if (order.getWeekDay() == WeekDay.FRIDAY) {}


你不再需要记住常数类,而且如果有任何客户端要使用你的代码,则不必怀疑星期一实际上是用 0 还是 1 表示。


我希望这个例子可以清楚地展示为什么在定义常量时应该考虑对整数使用枚举。枚举将使我们的代码不易出错,更易于阅读,并且更易于维护!


最后,推荐阅读《Effective Java 第3版[2019]》[1]这本好书。


引用链接


[1] 《Effective Java 第3版[2019]》: https://github.com/doocs/technical-books#backend


[2] GitHub 技术社区 Doocs: https://github.com/doocs


目录
相关文章
|
14天前
|
存储 Java 开发者
Java 里的“变形金刚”:变量与常量的前世今生!
【6月更文挑战第14天】Java 中的变量和常量是编程基础,变量是可变的容器,用于存储不同类型的数据,如示例中的 `age`;常量(如 `MAX_VALUE`)是固定不变的值,用 `final` 定义。理解两者及其作用至关重要,它们确保程序的稳定性和准确性。在实际编程中,合理使用变量和常量可以提高代码可读性和可维护性。它们是构建程序的基础,对新手和资深开发者都极其重要。
|
14天前
|
存储 小程序 Java
打破传统,Java 变量与常量让你重新认识编程的魅力!
【6月更文挑战第14天】Java编程中的变量与常量赋予程序灵活性和动态性。变量如魔法盒子,其值可变,提供程序的适应性;常量则如灯塔,值恒定,确保稳定性。两者结合构建复杂程序,变量用于处理数据,常量定义规则。在项目中,规范管理变量和常量能提升代码可读性和维护性。无论是小游戏还是复杂系统,它们都是不可或缺的工具,激发编程的无限可能。
|
1天前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
5 1
|
6天前
|
安全 Java 网络安全
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
【6月更文挑战第22天】JAVA网络编程中,URL代表统一资源定位符,用于表示网络资源地址。通过`new URL("address")`创建URL对象,可解析和访问其组件。URLConnection是与URL建立连接的接口,用于定制HTTP请求,如设置GET/POST、超时及交换数据。
|
10天前
|
Java
在 Java 中,类是一种定义对象的模板,它包含数据成员(字段)和方法。
在 Java 中,类是一种定义对象的模板,它包含数据成员(字段)和方法。
|
14天前
|
Java
Java 基础深度解析:变量与常量的声明、赋值与初始化的权威指南
【6月更文挑战第14天】Java编程中的变量和常量是基础关键。声明变量如`int age;`,赋值与初始化可在声明时或后续代码中完成。常量用`final`修饰,如`public static final double PI = 3.14159;`,且只能赋值一次。变量命名应具描述性,常量值设定后尽量不变,注重代码的可读性和可维护性。熟练掌握这些将有助于编写高质量Java程序。
|
14天前
|
存储 Java
Java 新手进阶:从变量到常量,一步步走向编程巅峰!
【6月更文挑战第14天】Java新手应掌握变量与常量,它们是编程基础。通过示例展示变量(如矩形的长度和宽度)用于存储可变数据,常量(如重力加速度)用于表示固定值。理解不同类型的变量,如字符串、整型和浮点型,并用`final`关键字定义常量。在银行账户管理程序案例中,变量跟踪账户信息,常量表示年利率。熟悉这些概念将提升编程技能。
|
14天前
|
存储 Java 容器
那些年,我们一起学过的 Java 变量与常量
【6月更文挑战第14天】Java学习中,变量和常量至关重要。变量如灵活容器,存储各类数据,示例:`int number = 10; number = 20;`。常量如圆周率`PI`,定义后不可变。Java有整型、浮点型、字符型、字符串型等变量和常量。合理使用能提升代码规范性和可读性,命名规范至关重要。变量和常量是编程基础,影响深远,共同构建稳定系统。
|
14天前
|
存储 Java 开发者
在 Java 的星辰大海中,寻找变量与常量的那份执着与坚守。
【6月更文挑战第14天】Java 中的变量与常量各有特色。变量如善变的艺术家,值可随程序需求变化,适于存储动态数据;而常量如同坚定不移的灯塔,值恒定不变,为程序提供稳定参照。变量用于处理复杂情况,常量定义固定规则。两者在内存管理和编程风格上各有作用,共同构建程序并确保其正确性与稳定性。理解并巧妙运用它们的差异,能提升 Java 编程的效率和质量,探索编程的无限可能。
|
14天前
|
存储 Java
变量?常量?Java 里的这对“欢喜冤家”!
【6月更文挑战第14天】Java编程中,变量和常量是关键元素。变量用于存储不同类型的数据,如`int`、`double`、`char`,需赋予有意义的名称并注意作用域。常量用`final`修饰,保持值不变,命名通常全大写。善用常量提升代码可维护性,如配置参数。在复杂数据结构场景下,合理使用两者使代码更简洁高效。遵循最佳实践,灵活运用变量和常量,将使代码更规范、易读、高效,为程序开发增添价值。