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

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

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

我已经查看了很多关于此问题的帖子,但我仍然无法弄清楚最好的方法是什么。

非常感谢任何帮助。

最佳答案

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

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() 应该是私有(private)的,除非你只想从外部类访问它们。

关于java - 有一个静态方法在枚举中使用非静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29421818/

相关文章:

java - 这个 Java 语法是什么意思?

c++ - 如何消除此枚举到字符串映射代码的样板?

c++ - 全局变量在不同的静态方法中使用时会得到不同的值

C#:枚举值可以保存为设置吗?

static - 替换内核模块中的静态函数

java - 为什么这个静态方法慢慢地需要更长的时间才能完成?

java - 使用java应用提取信息

java - 闭源 Java 应用程序

java - 无法解析为类型 - .java 文件位于包中并且未被看到

java - 一般应用枚举成员或方法