我有一个静态最终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) { ... }
...同时仍然在一个地方保持实际定义。感谢。
答案 0 :(得分:2)
只需使用名为EventStatus
的常见顶级类型即可。这是正常的,我认为任何Java程序员都不会觉得它让人感到困惑......你想要做的事情听起来更加令人困惑。
如果您正在寻找的是一组常见的枚举常量,然后是定义特定于某个类的其他常量的子类......那么,那里你几乎没有运气。你不能用枚举做到这一点。一个选项(不是说它是最好的)是使EventStatus
成为一个接口,然后让GlobalEventStatus
成为实现该接口的枚举。然后,您可以使用另一个枚举ResponseControl.Status
或其他一些也实现EventStatus
。
我还应该提到像ResponseControl.EventStatus
这样的东西不是“子类”而是“嵌套类”。