我们知道java enum类:
我有多个枚举类,如下所示:
enum ResourceState {
RUNNING, STOPPING,STARTTING;//...
void aMethod() {
// ...
}
}
enum ServiceState {
RUNNING, STOPPING,STARTTING,ERROR;//...
void aMethod() {
// ...
}
}
枚举aMethod()
和ResourceState
中的方法ServiceState
完全相同。
在OOP中,如果ResourceState
和ServiceState
不是枚举,则应将相同的方法抽象为超级抽象类,如下所示:
abstract class AbstractState{
void aMethod() {
// ...
}
}
但是ResourceState无法从AbstractState扩展,你有什么想法可以解决吗?
答案 0 :(得分:5)
枚举不能扩展其他类,但可以实现接口。因此,更面向对象的方法是让您的枚举实现一个公共接口,然后使用委托给支持类,提供真正的实现:
public interface SomeInterface {
void aMethod();
}
public class SomeInterfaceSupport implements SomeInterface {
public void aMethod() {
//implementation
}
}
public enum ResourceState implements SomeInterface {
RUNNING, STOPPING,STARTTING;
SomeInterfaceSupport someInterfaceSupport;
ResourceState() {
someInterfaceSupport = new SomeInterfaceSupport();
}
@Override
public void aMethod() {
someInterfaceSupport.aMethod();
}
}
答案 1 :(得分:3)
啊,是的,这个限制让我咬了几次。基本上,除了你应用枚举的最简单的模型之外,它会发生。
我找到解决此问题的最佳方法是使用从aMethod
调用的静态方法的实用程序类。
答案 2 :(得分:2)
您可以使用旧的“Type Safe Enum设计模式”替换枚举:
public class ResourceState {
private ResourceState() {
}
public void aMethod() { .... }
public static ResourceState RUNNING = new ResourceState();
public static ResourceState STOPPING = new ResourceState();
....
}
然后扩展它并在需要时覆盖aMethod。