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

have a static method use a non-static member in enum

我有以下代码:

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

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

我已经在 SO 上查看了很多关于此的帖子,但我仍然无法确定最佳方法是什么。

非常感谢任何帮助。

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

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

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

DateFormats.DDMMYYYY.getDay()

您正在 DDMMYYYY 实例上调用 getDay(),并且您希望 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() 应该是私有的,除非您只想从外部 class 访问它们.