关于java enum的一个不好的做法

时间:2013-09-08 18:59:36

标签: java enums

这个问题是关于某种糟糕的编程习惯。 我正在寻找一些可以解释它的好文章以及它为什么不好。 不幸的是,我不知道这种做法的任何名称或行话。 因此,我将尝试描述它,并要求您告诉我它是如何调用的,并且可能会向我推荐一篇关于该主题的好文章。

假设我们有一些枚举:

public enum Day
{
    SUNDAY, MONDAY, ...
}

接下来,假设服务器端程序员每天都附加一个数字id。 当然,正确的做法是使用Day将每个Integer映射到EnumMapgetId()仅在服务器端代码中定义和使用。 相反,他弄乱了常用代码并添加了public enum Day { SUNDAY {public int getId() {return 100;}}, MONDAY {public int getId() {return 101;}}, ...; public abstract int getId(); } 方法:

public enum Day
{
    SUNDAY {
        public int getId() {return 100;}
        public String getName() {return "sunday";}
    },
    MONDAY {
        public int getId() {return 101;};
        public String getName() {return monday";}
    },
    ...;

    public abstract int getId();
    public abstract String getName();
}

接下来,GUI程序员想要每天附加一个字符串,所以他添加了自己的东西:

{{1}}

你明白了......

你怎么称呼这个东西? 知道任何关于它的好文章吗?

1 个答案:

答案 0 :(得分:7)

我不明白为什么这是坏事,除了它比它应该更冗长。您可以将其替换为:

public enum Day {
    SUNDAY(0, "sunday"),
    MONDAY(1, "monday"),
    TUESDAY(2, "tuesday"),
    WEDNESDAY(3, "wednesday"),
    THURSDAY(4, "thursday"),
    FRIDAY(5, "friday"),
    SATURDAY(6, "saturday");

    private final int mIndex;
    private final String mName;

    Day (int index, String name) {
        mIndex = index;
        mName = name;
    }

    public int getIndex () {
        return mIndex;
    }

    public String getName () {
        return mName;
    }

    public static Day fromIndex (int index) {
        if (index < 0 || index > 6) {
            throw new IllegalArgumentException(index + " is not a valid day index.");
        }

        Day result = null;

        for (Day day : values()) {
            if (day.mIndex == index) {
                result = day;
                break;
            }
        }

        return result;
    }
}

我经常使用此模式来保存来自作为整数返回的Web服务的数据。这当然比使用Day.ordinal()更好的做法,因为你的枚举中的定义顺序变得很重要,并且要求索引是顺序的。