2013-03-20 15 views
5

jak wiemy, że klasy Javy ENUM:Jak ponowne wykorzystanie kodu w stwardnieniu Enum

  1. niejawnie rozciąga java.lang.Enum;
  2. nie może rozciąć się od innych klas wyliczeniowych.

mam wiele klasy enum, jak poniżej:

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

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

zastosowano metodę aMethod() w enum ResourceState i ServiceState jest dokładnie taka sama.

w OOP, jeśli ResourceState i ServiceState nie są enum, powinni streszczenie tej samej metody do super-klasa abstrakcyjna, podobnie jak to:

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

ale ResourceState jest w stanie rozciąga się od AbstractState, czy masz jakieś pomysł do obejścia?

+0

co masz na myśli „dokładnie to samo”? Czy nie ma odniesienia do obu enum? Jeśli tak, można wyodrębnić logikę do metody statycznej. –

+0

To właśnie teraz robię, ale szukam lepszego rozwiązania. – BlackJoker

Odpowiedz

3

Ach tak, to ograniczenie ugryzło mnie kilka razy. Zasadniczo dzieje się tak, gdy masz tylko najbardziej banalny model, na którym zastosujesz enum.

Najlepszym sposobem obejścia tego problemu była klasa narzędziowa z metodami statycznymi, które są wywoływane z poziomu aMethod.

+0

Tak, to może być najlepszy sposób na zminimalizowanie zduplikowanego kodu. – BlackJoker

2

Można wymienić enum ze starego typu „Safe Enum wzorzec projektowy”:

public class ResourceState { 
    private ResourceState() { 
    } 

    public void aMethod() { .... } 

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

A potem przedłużyć go i zastąpić aMethod razie potrzeby.

+0

Tak, to jest dobre obejście. – BlackJoker

4

Wyliczenia nie mogą rozszerzać innych klas, ale mogą implementować interfejsy. Więc bardziej podejście obiektowe byłoby, aby Twoje teksty stałe wdrożyć wspólny interfejs, a następnie użyć delegacji do grupy wsparcia, która zapewnia prawdziwą implementacja:

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

Nie byłoby "public class SomeInterfaceSupport" 'musi być' public class SomeInterfaceSupport implementuje SomeInterface'? –

+0

Tak, poprawione. – dcernahoschi

Powiązane problemy