Can enums be subclassed to add new elements?

前端 未结 15 1851
臣服心动
臣服心动 2020-11-22 12:02

I want to take an existing enum and add more elements to it as follows:

enum A {a,b,c}

enum B extends A {d}

/*B is {a,b,c,d}*/

Is this po

15条回答
  •  逝去的感伤
    2020-11-22 12:23

    Enums represent a complete enumeration of possible values. So the (unhelpful) answer is no.

    As an example of a real problem take weekdays, weekend days and, the union, days of week. We could define all days within days-of-week but then we would not be able to represent properties special to either weekdays and weekend-days.

    What we could do, is have three enum types with a mapping between weekdays/weekend-days and days-of-week.

    public enum Weekday {
        MON, TUE, WED, THU, FRI;
        public DayOfWeek toDayOfWeek() { ... }
    }
    public enum WeekendDay {
        SAT, SUN;
        public DayOfWeek toDayOfWeek() { ... }
    }
    public enum DayOfWeek {
        MON, TUE, WED, THU, FRI, SAT, SUN;
    }
    

    Alternatively, we could have an open-ended interface for day-of-week:

    interface Day {
        ...
    }
    public enum Weekday implements Day {
        MON, TUE, WED, THU, FRI;
    }
    public enum WeekendDay implements Day {
        SAT, SUN;
    }
    

    Or we could combine the two approaches:

    interface Day {
        ...
    }
    public enum Weekday implements Day {
        MON, TUE, WED, THU, FRI;
        public DayOfWeek toDayOfWeek() { ... }
    }
    public enum WeekendDay implements Day {
        SAT, SUN;
        public DayOfWeek toDayOfWeek() { ... }
    }
    public enum DayOfWeek {
        MON, TUE, WED, THU, FRI, SAT, SUN;
        public Day toDay() { ... }
    }
    

提交回复
热议问题