如何将全局枚举作为多个类的子类?

时间:2011-04-22 18:56:54

标签: java enums

我有一个静态最终Java类库,它描述了一系列标准。其中一个类(简化)的夜晚看起来像:

public static final class ResponseControl { 
    public static enum EventStatus {
        EVENT_RECEIVED,
        EVENT_STARTED,
        EVENT_COMPLETED;
    }
}

将enum EventStatusOption包含在ResponseControl类的子类中是很方便的,因为这是它在标准文档中定义的位置,而这正是人们将要寻找它的地方。它允许他们说出这样的话:

if (respCtl.status == ResponseControl.EventStatus.EVENT_STARTED) { ... }

但是我确实有数百个这样的类,并且在某些情况下,在多个类中使用相同的枚举。能够在其他地方定义枚举,然后做这样的事情会很好:

public static enum GlobalEventStatus {
    EVENT_RECEIVED,
    EVENT_STARTED,
    EVENT_COMPLETED;
}
public static final class ResponseControl { 
    public static enum EventStatus extends GlobalEventStatus {}
    public final EventStatus status;
}

if (respCtl.status == ResponseControl.EventStatus.EVENT_STARTED) { ... }
但是,我不能这样做,因为扩展枚举是不合法的,甚至(在我的情况下)我根本不想扩展它们,我只是想制作全局类型在当地班级有售。有谁知道如何实现这个目标?


下面ColinD的第二段回答实际上是我需要的答案。说:

public interface GlobalEvent
{
    public static enum Status {
        EVENT_RECEIVED,
        EVENT_STARTED,
        EVENT_COMPLETED;
    }
}

public static final class ResponseControl {
    public static enum Event implements GlobalEvent
    public final Event.Status status;
}

我可以允许我的用户说:

if (respCtl.status == ResponseControl.Event.Status.EVENT_STARTED) { ... }

...同时仍然在一个地方保持实际定义。感谢。

1 个答案:

答案 0 :(得分:2)

只需使用名为EventStatus的常见顶级类型即可。这是正常的,我认为任何Java程序员都不会觉得它让人感到困惑......你想要做的事情听起来更加令人困惑。

如果您正在寻找的是一组常见的枚举常量,然后是定义特定于某个类的其他常量的子类......那么,那里你几乎没有运气。你不能用枚举做到这一点。一个选项(不是说它是最好的)是使EventStatus成为一个接口,然后让GlobalEventStatus成为实现该接口的枚举。然后,您可以使用另一个枚举ResponseControl.Status或其他一些也实现EventStatus

我还应该提到像ResponseControl.EventStatus这样的东西不是“子类”而是“嵌套类”。