在哪里使用枚举类型

时间:2011-08-05 10:32:41

标签: java enums

我必须创建自己的日历类(我知道一个已经存在,但我们需要编写自己的日历类,所以我不能使用预先存在的Calendar或{{1}中的任何方法} classes),我们需要使用枚举类型。我不确定我会用它们,因为我对它们不太熟悉。

如果有帮助,我的构造函数会采用日期,月份和年份值(例如2011年5月8日)。

2 个答案:

答案 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,我认为这很好地解释了它们是什么,以及何时你想要使用它们。

除此之外的简短回答是,您可以将它们用于任何值可以是某个(有限)常数之一的值。我相信你至少可以想到一个与日历相关的字段,这个字段被限制在一定范围的有效值中(尽管你不允许使用内置日历,如果你想要一些,请看看它们提示)。