【问题标题】:Enums and how they work [duplicate]枚举及其工作方式[重复]
【发布时间】:2014-08-19 13:22:33
【问题描述】:

我最近看了一个关于枚举的教程。首先,语法超出了我的想象。除此之外,我似乎也不了解该主题及其特定用途。教程含糊不清,评论员似乎只是在写代码和说话,而不是在解释她正在使用的代码。请不要仅仅对我的问题投反对票,因为您个人认为这是一个简单的话题。我已经看过教程,发现它们令人困惑。如果你觉得你不能回答我的问题,一个网站链接或你的视频也将不胜感激。快乐编码!

【问题讨论】:

  • 那么你想用枚举解决什么问题?
  • 你看过this吗?
  • 请阅读帮助中心。你的问题文本有一半是噪音。
  • 查找 Joshua Bloch,Effective Java,第 2 版。第 6 章第 30 条介绍了枚举的基础知识,整本书非常值得一读。 PDF 可以免费下载。
  • 哇,他们禁止我的帐户提问。他们的帮助中心指出,您不会因为一些被否决的帖子而被禁止。这不是真的):

标签: java enums


【解决方案1】:

枚举适用于具有一组固定值的概念。枚举的一个很好的例子是一年中的月份。在公历中,有十二个月,您可以这样创建一个月份枚举:

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;
    }
}

但是,您会注意到,二月并非每年都有 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多