我必须创建自己的日历类(我知道一个已经存在,但我们需要编写自己的日历类,所以我不能使用预先存在的Calendar
或{{1}中的任何方法} classes),我们需要使用枚举类型。我不确定我会用它们,因为我对它们不太熟悉。
如果有帮助,我的构造函数会采用日期,月份和年份值(例如2011年5月8日)。
答案 0 :(得分:1)
枚举是首选的武器。例如:
public enum Month {
JANUARY,
FEBRUARY,
MARCH,
APRIL,
... etc
}
这使得它们的使用强类型。
您可以指定接受枚举作为参数的方法,例如:
private Month month;
public void setMonth(Month month) {
this.month = month;
}
替代方法是使用String(或int)内容,通常称为 stringly typed ,但这些常量不是类型 - 接受字符串的方法将接受任何字符串 - 例如“foo” 的:
private String month;
public void setMonth(String month) {
this.month = month; // Will accept "Foo"
}
枚举可以(大多数情况下)像普通类一样使用 - 你可以有构造函数(私有),字段和方法,如下所示:
public enum Month {
JANUARY("January",
FEBRUARY("February",
...
DECEMBER("December");
private final name;
private Month(String name) { // Constructors must be private
this.name = name;
}
public String getName() {
return name;
}
}
你甚至可以拥有setter,因为enum不一定是不可变的(他们的字段不一定是最终的),但是不建议。
已编辑:更多信息
枚举不能extends
,但它们可以implements
,因此如果您有多个月类型(针对不同的日历),您可以执行此操作以保持强类型。以下是日历和月份抽象的例子
interface Month {
}
enum GregorianMonth implements Month {
}
enum ChineseMonth implements Month {
}
abstract class Calendar<T extends Enum<T> & Month> { // T must be both an enum and a Month
T month;
void setMonth(T month) {
this.month = month;
}
}
class GregorianCalendar extends Calendar<GregorianMonth> {
}
class ChineseCalendar extends Calendar<ChineseMonth> {
}
答案 1 :(得分:0)
你的第一站应该是Java enum tutorial,我认为这很好地解释了它们是什么,以及何时你想要使用它们。
除此之外的简短回答是,您可以将它们用于任何值可以是某个(有限)常数之一的值。我相信你至少可以想到一个与日历相关的字段,这个字段被限制在一定范围的有效值中(尽管你不允许使用内置日历,如果你想要一些,请看看它们提示)。