2013-03-20 25 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