【问题标题】:How to reuse code in multiple Enum如何在多个 Enum 中重用代码
【发布时间】:2013-03-09 13:40:25
【问题描述】:

我们知道java枚举类:

  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 扩展,你有什么想法可以解决吗?

【问题讨论】:

  • 你的意思是“完全一样”?两个枚举都没有引用吗?如果是这样,您可以将逻辑提取到静态方法中。
  • 这就是我现在正在做的,但我正在寻找更好的解决方案

标签: java oop enums


【解决方案1】:

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

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

【讨论】:

  • public class SomeInterfaceSupport 不是必须是 public class SomeInterfaceSupport implements SomeInterface 吗?
【解决方案2】:

啊,是的,这个限制已经困扰了我好几次了。基本上,只要您拥有应用枚举的最简单模型以外的任何东西,就会发生这种情况。

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

【讨论】:

  • 是的,这可能是减少重复代码的最佳方法
【解决方案3】:

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

public class ResourceState {
    private ResourceState() {
    }

    public void aMethod() { .... }

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

然后根据需要扩展它并覆盖aMethod。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2021-06-17
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多