0

这个问题是关于某种不良的编程习惯。我正在寻找一些好的文章来解释它以及它为什么不好。不幸的是,我不知道这种做法的任何名称或行话。所以我会尝试描述它,并请你告诉我它是如何被调用的,也许可以让我参考一篇关于这个主题的好文章。

假设我们有一些枚举:

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

接下来,假设服务器端程序员每天都附加一个数字 id。当然,正确的做法是将每个映射DayIntegerusing an EnumMap,它仅在服务器端代码中定义和使用。相反,他弄乱了通用代码并添加了一个getId()方法:

public enum Day
{
    SUNDAY {public int getId() {return 100;}},
    MONDAY {public int getId() {return 101;}},
    ...;

    public abstract int getId();
}

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

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

你明白了...

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

4

1 回答 1

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(),因为枚举中的定义顺序变得很重要,并且要求索引是连续的。

于 2013-09-08T19:06:05.240 回答