繁体   English   中英

如何在多个枚举中重用代码

[英]How to reuse code in multiple Enum

我们知道java enum类:

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

我有多个枚举类,如下所示:

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

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

枚举ResourceStateServiceState的方法aMethod()完全相同。

在OOP中,如果ResourceStateServiceState不是枚举,则它们应该将相同的方法抽象为超级抽象类,如下所示:

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

但是ResourceState无法从AbstractState扩展,你有什么想法可以解决吗?

枚举不能扩展其他类,但可以实现接口。 因此,更面向对象的方法是使您的枚举实现一个公共接口,然后使用委托给提供真正实现的支持类:

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

啊,是的,这个限制让我咬了几次。 基本上,只要你有任何东西,除了你应用枚举的最简单的模型,它就会发生。

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

您可以使用旧的“Type Safe Enum设计模式”替换枚举:

public class ResourceState {
    private ResourceState() {
    }

    public void aMethod() { .... }

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

然后扩展它并在需要时覆盖aMethod。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM