关于java:枚举及其工作原理

Enums and how they work

本问题已经有最佳答案,请猛点这里访问。

我最近看了一个关于枚举的教程。首先也是最重要的一点,语法在我的头脑中占据了很大的位置。过去,我似乎也不理解这个主题及其具体用途。教程很含糊,评论员似乎只是在写代码和说话,而没有必要解释她正在使用的代码。请不要因为你个人认为这是一个简单的话题而直接投我的票。我已经看了教程,发现它们令人困惑。如果你觉得你不能回答我的问题,一个链接到一个网站或一个你管视频也会被赞赏。快乐编码!


枚举用于具有固定值集的概念。枚举的一个好例子是一年中的月份。在公历中,有12个月,您可以创建月份枚举:

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

您可以向个别成员灌输特定的行为,例如,我们可以提供numberOfDays属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
    }
}

但是,你会注意到二月并不是每年28天。相反,你需要给它更多的特殊行为。那么,您可以为FEBRUARY创建一个类体来这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
    }
}