有一个静态方法在枚举中使用非静态成员

时间:2015-04-02 20:24:27

标签: java enums static-methods non-static

我有以下代码:

private enum DateFormats {
        DDMMYYYY(0, 2, 4),
        MMDDYYYY(2, 0, 4),
        YYYYMMDD(6, 4, 0);

        private final int dayIndex;
        private final int monthIndex;
        private final int yearIndex;

        private DateFormats(int dayIndex, int monthIndex, int yearIndex) {
            this.dayIndex = dayIndex;
            this.monthIndex = monthIndex;
            this.yearIndex = yearIndex;
        }

        //Error happens here...
        private static int getDay(String date){ return Integer.parseInt(date.substring(dayIndex, dayIndex+2)); }
        private static int getMonth(String date){ return Integer.parseInt(date.substring(monthIndex, monthIndex+2)); }
        private static int getYear(String date){ return Integer.parseInt(date.substring(yearIndex, yearIndex+4)); }
    }

我得到的错误:

non-static variable dayIndex cannot be referenced from a static context
        private static int getDay(String date){ return Integer.parseInt(date.substring(dayIndex, dayIndex+2)); }

我理解错误的发生是因为函数是静态的并且使用了一个尚未设置的非静态成员来解析整数。

我已经在这里查了很多关于此的帖子,但我仍然无法理解最好的方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

创建枚举时,您有三个实例:

DDMMYYYY(0, 2, 4),
MMDDYYYY(2, 0, 4),
YYYYMMDD(6, 4, 0);

其中每个实例都有三个字段dayIndexmonthIndexyearIndex。当你这样做时:

DateFormats.DDMMYYYY.getDay()

您正在getDay()实例上调用DDMMYYYY,并且您希望getDay()使用您在构造函数中设置的特定实例变量,因此getDay()没有意义是静态的。

例如:

String date = "12052015";
int day1 = DateFormats.DDMMYYYY.getDay(date);
int day2 = DateFormats.MMDDYYYY.getDay(date);
System.out.println(day1);
System.out.println(day2);

结果:

12
05

此外,我不明白为什么getDay()getMonth()getYear()应该是私有的,除非您只想从外部类访问它们。