2013-03-20 25 views
5

Như chúng ta đã biết rằng lớp java enum:Làm thế nào để sử dụng lại mã trong nhiều Enum

  1. ngầm kéo dài java.lang.Enum;
  2. không thể kéo dài từ bất kỳ lớp học enum nào khác.

Tôi có nhiều lớp enum, như dưới đây:

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

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

phương pháp aMethod() trong enum ResourceStateServiceState là giống hệt nhau.

trong OOP, nếu ResourceStateServiceState không enum, họ nên trừu tượng cùng phương pháp để một lớp trừu tượng siêu, như thế này:

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

nhưng ResourceState là không thể kéo dài từ AbstractState, Bạn có bất cứ ý tưởng để làm việc xung quanh?

+0

Ý của bạn là gì? Không có tham chiếu của cả hai enum? Nếu đó, bạn có thể trích xuất logic thành một phương thức tĩnh. –

+0

Đó là những gì tôi đang làm bây giờ, nhưng tôi đang tìm kiếm một giải pháp tốt hơn – BlackJoker

Trả lời

3

Có, giới hạn này đã cắn tôi một vài lần. Về cơ bản, nó xảy ra bất cứ khi nào bạn có bất cứ điều gì nhưng mô hình tầm thường nhất mà bạn áp dụng enum.

Cách tốt nhất tôi tìm thấy để giải quyết vấn đề này là một lớp tiện ích với các phương thức tĩnh được gọi từ aMethod của bạn.

+0

Vâng, đó là tầm nhìn tốt nhất để giảm thiểu mã trùng lặp – BlackJoker

2

Bạn có thể thay thế các enum với "Loại Safe Enum thiết kế mẫu" cũ:

public class ResourceState { 
    private ResourceState() { 
    } 

    public void aMethod() { .... } 

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

Và sau đó mở rộng nó và ghi đè aMethod nếu cần thiết.

+0

Có, đây là một công việc tốt xung quanh – BlackJoker

4

Enums không thể mở rộng các lớp khác, nhưng có thể triển khai giao diện. Vì vậy, một phương pháp tiếp cận hướng đối tượng hơn sẽ làm cho enums của bạn thực hiện một giao diện chung và sau đó sử dụng ủy quyền cho một lớp hỗ trợ cung cấp thực sự thực hiện:

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

Sẽ không 'public class SomeInterfaceSupport 'phải là' lớp công khai SomeInterfaceSupport thực hiện SomeInterface'? –

+0

Có, đã sửa. – dcernahoschi

Các vấn đề liên quan