枚举及其工作原理

时间:2014-06-28 16:11:21

标签: java enums

我最近看了一个关于枚举的教程。首先,语法超越了我的脑海。过去,我似乎也不了解这个主题及其具体用途。该教程含糊不清,评论员似乎只是编写代码和谈话,而不是刻意解释她正在使用的代码。请不要只是投票我的问题,因为你个人认为这是一个简单的话题。我已经看过教程并发现它们令人困惑。如果您觉得无法回答我的问题,也可以欣赏指向网站或管视频的链接。快乐的编码!

1 个答案:

答案 0 :(得分:0)

枚举适用于具有固定值集的概念。枚举的一个很好的例子是一年中的几个月。在阳历中,有十二个月,你可以创造一个月枚举:

enum Month {
    JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
    JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}

您可以为个别成员注入特定行为,例如,我们可以提供numberOfDays属性:

enum Month {
    JANUARY(31), FEBRUARY(28), MARCH(31), APRIL(30), MAY(31), JUNE(30),
    JULY(31), AUGUST(31), SEPTEMBER(30), OCTOBER(31), NOVEMBER(30), DECEMBER(31);

    private final int numberOfDays;

    Month(int numberOfDays) {
        this.numberOfDays = numberOfDays;
    }

    public int getNumberOfDays() {
        return numberOfDays;
    }
}

但是,你会发现2月份每年都没有28天。相反,你需要给它更特殊的行为。那么,您为FEBRUARY创建了一个类主体:

enum Month {
    JANUARY(31),
    FEBRUARY(28) {
        @Override
        public int getNumberOfDays(int year) {
            return isLeapYear(year) ? 29 : 28;
        }

        private boolean isLeapYear(int year) {
            return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
        }
    },
    MARCH(31), APRIL(30), MAY(31), JUNE(30), JULY(31),
    AUGUST(31), SEPTEMBER(30), OCTOBER(31), NOVEMBER(30), DECEMBER(31);

    private final int numberOfDays;

    Month(int numberOfDays) {
        this.numberOfDays = numberOfDays;
    }

    public int getNumberOfDays(int year) {
        return numberOfDays;
    }
}