簡體   English   中英

關於Java枚舉的錯誤做法

[英]A bad practice regarding java enum

這個問題與某種不良的編程習慣有關。 我正在尋找一些好的文章,以解釋它以及它為什么不好的原因。 不幸的是,我不知道這種做法的名字或行話。 因此,我將嘗試描述它,並請您告訴我它的名稱,並可能使我參考有關該主題的好文章。

假設我們有一些枚舉:

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

接下來,假設服務器端程序員將數字id附加到每一天。 當然,正確的做法是使用EnumMap Day映射到Integer ,該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();
}

你明白了...

你怎么稱呼這個東西? 知道關於它的任何好文章嗎?

我不明白為什么這很糟糕,除了它比應該的更為冗長。 您可以將其替換為:

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()更好,因為這樣,枚舉中的定義順序就變得很重要,並且要求索引是順序的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM