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> {

}