2013-03-20 28 views
5

我们知道,java的枚举类:如何在多个枚举重用代码

  1. 隐含扩展java.lang.Enum;
  2. 不能从任何其他枚举类扩展。

我有多个枚举类,象下面这样:

enum ResourceState { 
    RUNNING, STOPPING,STARTTING;//... 
    void aMethod() { 
     // ... 
    } 
} 

enum ServiceState { 
    RUNNING, STOPPING,STARTTING,ERROR;//... 
    void aMethod() { 
     // ... 
    } 
} 

方法aMethod()枚举ResourceStateServiceState是完全一样的。

在OOP

,如果ResourceStateServiceState不枚举,他们应该抽象相同的方法来一个超抽象类,像这样:

abstract class AbstractState{ 
    void aMethod() { 
     // ... 
    } 
} 

但ResourceState无法从AbstractState延伸,你有什么想办法解决?

+0

你是什么意思“一模一样”?没有提及这两个枚举?如果那样的话,你可以将逻辑提取成静态方法。 – 2013-03-20 12:48:59

+0

这就是我现在正在做的,但我正在寻找一个更好的解决方案 – BlackJoker 2013-03-20 12:56:07

回答

3

啊是的,这个限制已经咬了我几次。基本上,只要你有任何东西,但是你应用枚举最微不足道的模型,它就会发生。

我发现解决这个问题的最好方法是使用从您的aMethod调用的静态方法的实用程序类。

+0

是的,这是减少重复代码的最佳方法 – BlackJoker 2013-03-20 12:57:24

2

您可以替换旧的“类型安全枚举设计模式”枚举:

public class ResourceState { 
    private ResourceState() { 
    } 

    public void aMethod() { .... } 

    public static ResourceState RUNNING = new ResourceState(); 
    public static ResourceState STOPPING = new ResourceState(); 
    .... 
} 

,然后扩展它,如果需要覆盖amethod方法。

+0

是的,这是一个很好的解决方案 – BlackJoker 2013-03-20 12:59:06

4

枚举不能扩展其他类,但可以实现接口。因此,更多的面向对象的方法是使你的枚举实现一个共同的接口,然后使用代表团的辅助类,提供了真正的implemetation:

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(); 
    } 
} 
+0

不会公共类SomeInterfaceSupport '必须是'公共类SomeInterfaceSupport实现SomeInterface'? – 2018-01-11 02:24:29

+0

是的,已更正。 – dcernahoschi 2018-01-11 09:53:52