java里面常量怎么来定义(如何在Java中定义常量)
java里面常量怎么来定义(如何在Java中定义常量)public class Order { 在本文中,我们将使用一个非常常见的常量候选-工作日!让我们假设,我们有一个类表示在线商店中的订单,在那里我们希望跟踪订单发生的一周中的哪一天。我们班的样子如下:
对于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表示。
我希望这个例子向您演示为什么在定义常量时应该考虑在整数上使用枚举。