0

可能重复:
Java 扩展枚举

我想做的是一些类,它具有枚举中的所有方法以及我自己的方法,例如

public class enum_with_shift extends enum{
    public enum_with_shift next(){
        ...
    };
}

但你不能扩展枚举我想用它来创建类似的东西:

public class Days_of_week extends enum_with_shift{
    MONDAY, TUESDAY, ...
}

public class Months extends enum_with_shift{
    JANUARY, ...
}

我怎么做?

4

3 回答 3

3

每个枚举都有一个ordinal,因此获取所有枚举的“下一个”值是有效的 - 而不仅仅是那些您尝试使用基类的枚举。这意味着您可以编写以下辅助方法:

public static <T extends Enum<T>> T getNext(T current) {
    Class<T> enumType = current.getDeclaringClass();
    T[] enumConstants = enumType.getEnumConstants(); // Similar to e.g. Day.values()

    int currentOrdinal = current.ordinal();
    int nextOrdinal = currentOrdinal + 1;
    if (nextOrdinal == enumConstants.length) { // Handle wrapping around to the beginning of the enum values
        nextOrdinal = 0;
    }

    return enumConstants[nextOrdinal];
}

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public enum Month  {
    JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}

public static void main(String... args) {
    System.out.println(getNext(Day.MONDAY)); // TUESDAY
    System.out.println(getNext(Day.SUNDAY)); // MONDAY

    System.out.println(getNext(Month.JANUARY)); // FEBRUARY
    System.out.println(getNext(Month.DECEMBER)); // JANUARY
}

如果您真的不想对所有枚举执行此操作(也许对于未严格排序的枚举没有意义),那么您可以应用标记接口,如下所示:

public interface Ordered {}

public enum Day implements Ordered {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public static <T extends Enum<T> & Ordered> T getNext(T current) {
    ...
}

您可以在此处找到有关反思性使用枚举的更多详细信息。

于 2012-10-04T17:46:31.627 回答
1

由于我不知道是什么enum_with_shift,我无法直接回答您的问题。

但你是对的。您不能扩展枚举。原因是 enum 只是一个扩展的常规类java.lang.Enum。由于 java 中没有多重继承,因此您不能扩展任何其他类。

我可以建议您使用常规类或java.lang.Enum直接扩展。看看我的文章: http: //java.dzone.com/articles/enum-tricks-dynamic-enums 我举了一个例子如何做到这一点。

于 2012-10-04T16:43:09.940 回答
0

上面的答案是正确的转到上面帖子中的链接,它将向您展示如何操作。

当一个类具有 is-a 关系时使用 extends 它只能是一件事 使用 implements 来确保 ab is-like-a 关系来断言类似的行为被实现“方法”

只需单独使用它们,您就不需要扩展您可以想象的所有内容,它们都定义了一个类型,一个定义了一天,另一个定义了月份的状态。您现在可以在名为 Date 的第三个类中使用这两个枚举。

public enum Day {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
}

public enum Month {     
JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
}
于 2012-10-04T17:01:35.413 回答