Java 在何处使用枚举类型
我必须创建自己的日历类(我知道已经存在一个日历类,但我们需要编写自己的日历类,因此我不能使用预先存在的Java 在何处使用枚举类型,java,enums,Java,Enums,我必须创建自己的日历类(我知道已经存在一个日历类,但我们需要编写自己的日历类,因此我不能使用预先存在的calendar或gregoriacalendar类中的任何方法),我们需要使用枚举类型。我不确定我会用这些做什么,因为我对它们不太熟悉 如果有帮助的话,我的构造函数会获取日期、月份和年份值(例如5、8、2011)。枚举是处理同一类型的有限值集时的首选武器。例如: public enum Month { JANUARY, FEBRUARY, MARCH, APRI
calendar
或gregoriacalendar
类中的任何方法),我们需要使用枚举类型。我不确定我会用这些做什么,因为我对它们不太熟悉
如果有帮助的话,我的构造函数会获取日期、月份和年份值(例如5、8、2011)。枚举是处理同一类型的有限值集时的首选武器。例如:
public enum Month {
JANUARY,
FEBRUARY,
MARCH,
APRIL,
... etc
}
这使得它们可以使用强类型
您可以指定接受枚举作为参数的方法,例如:
private Month month;
public void setMonth(Month month) {
this.month = month;
}
另一种方法是使用字符串(或int)contants,通常称为stringly-typed,但此类常量不是类型化的-接受字符串的方法将接受任何字符串-例如“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不必是不可变的(它们的字段不必是final),但不建议这样做
编辑:更多信息
枚举不能扩展
,但它们可以实现
,因此如果您有多个月类型(用于不同的日历),您可以这样做以保持强类型。下面是日历和月份抽象的示例
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> {
}
接口月{
}
枚举GregorianMonth实现月份{
}
enum ChineseMonth实现月份{
}
抽象类日历{//T必须是枚举和月份
T月;
无效设置月(T月){
本月=月;
}
}
类gregorianalendar扩展了日历{
}
类ChineseCalendar扩展了日历{
}
您的第一站应该是,我认为这很好地解释了它们是什么,以及您希望何时使用它们
除此之外,简短的回答是,如果某个值可以是某个(有限)常量中的一个,则可以将它们用于任何情况。我相信您至少可以想到一个与日历相关的字段,该字段被限制在特定的有效值范围内(尽管不允许您使用内置日历,但如果需要一些提示,请查看它们)。您需要支持哪种日历?(公历、佛历等?)在这种情况下,一周中的几天和一年中的几个月是最明显的候选日期。如果你的日历课程只涉及公历,那就太好了。如果你的日历可能需要处理没有“一月”等字样的日历,那就不太好了。所有日历都有一个月的概念吗?@Jon Skeet我只处理公历日历,所以这很有帮助。现在,很抱歉说“nooby”,因为我想用一个更好的词,但我仍然不确定我能用什么枚举。我在类中提供的一些方法是:打印当前月份的日历、打印当前年份、设置当前日期、获取当前日期、按给定天数/月份向前或向后滚动日历日期,以及比较两个日历对象。其中任何一个可以实现枚举类型吗?如果可以,如何实现?@Bhoemian:是的,看起来更好。
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> {
}