如何在Java中定义常量

135 篇文章 0 订阅

对于Java中的常量这一主题,似乎存在许多混淆。有些人使用整数或字符串来定义常量,而另一些人则使用枚举。.

我还遇到了在它们自己的接口中定义的常量–其中使用常量的类必须实现接口。此策略通常称为接口常量设计模式。

在本文中,我们将查看在Java中存储常量的两种最常见的策略:整数和枚举。

首先,无论何时决定使用常量,您都应该非常肯定常量不会随着时间的推移而改变,这样就可以避免重新编译。

在本文中,我们将使用一个非常常见的常量候选-工作日!

让我们假设,我们有一个类表示在线商店中的订单,在那里我们希望跟踪订单发生的一周中的哪一天。

我们班的样子如下:

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

注意,该类暂时不会编译-[datatype]只是我们将要使用的常量类型的占位符。

用整数定义常量

在Java中定义常量的最常用方法之一是通过整数,其中整数变量是静态的。

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

定义整数常量时要问的第一个问题是将它们放在哪里。我们直接把它们放在 Order 班级?还是我们给他们上课?

因为天是相当一般的,而不一定只是连接到类型的对象。Order,我们将在它们自己的类中定义它们 WeekDay.

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

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

现在,每当我们需要为一个订单设定一个特定的日期时,我们就这样做:

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

当我们想要检查订单是否发生在星期五的时候,我们只需打个电话:

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

到现在为止还好。这个设计肯定不会有什么问题吧?

那么,让我们假设一年后您将返回此代码–您必须检查订单是否发生在星期一。

哦,当然-你完全忘记了WeekDay上课…。
在这个场景中,您可以尝试这样的方法:

 if(order.getWeekDay() == 1) 

在那一刻,完全忘记了平日课,这段代码是非常有意义的。星期一是一周的第一天,所以平日应该是1,对吧?

但是不,它不是,因为静态int变量星期一被定义为0 在我们WeekDay班级!

这是一个很好的例子,说明了为什么你应该考虑避避整数常量的使用。它们容易出错,令人困惑,很难调试.

用Enum定义常数

在Java中定义常量的另一个选择是使用枚举.

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

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

注意没有私有构造函数–程序员不需要(你!)强制类不可实例化,因为枚举在默认情况下是不可实例化的!

设置WeekDay顺序与整数常量完全相同:

 order.setWeekDay(WeekDay.MONDAY);

至于订单是否是在星期五处理,我们如何处理也没有区别:

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

但是,关键的区别在于,这是在Order班级。

双管齐下order.setWeekDay(1);和if(order.getWeekDay() == 1)将使编译器抛出一个错误,因为当变量应该是类型时,您将尝试使用类型为整型的变量。 WeekDay!

回想一下您完全忘记了WeekDay班级。
对于枚举,这不再是一个问题。如果尝试使用整数而不是WeekDay,编译器只会抛出一个错误,告诉您需要使用WeekDay明灯。

换句话说,唯一能让你检查订单是否发生在星期五的事情是:

 if(order.getWeekDay == WeekDay.FRIDAY) 

再清楚不过了!

您不再被迫记住常量类,如果任何客户端使用您的代码,他们就不必怀疑星期一实际上是用0表示还是用1表示。

Enum将使您的代码更容易阅读,更易于维护!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值