Java,带构造函数的枚举

Java, enum with constructor

我正在重构一些用 Java 编写的遗留系统,我遇到了枚举构造函数的问题。

我有一个像这样的枚举 class(只是一个例子):

public enum Signal{
   ON(new InButton()),
   OFF(new OutButton())

   private final Button button;

   Signal(Button button) {
       this.button = button;
   }
}

InButton 和 OutButton 扩展了 Button 接口。

首次使用 Signal.Values() 方法访问枚举值。 (此外,在其中一个 Button 方法中,我有一个使用枚举的代码,例如 activateButton(Signal.ON))

在重构代码时,我想为 Button 创建一个新的构造函数来表达它的依赖性,例如 Button(String input)。

问题是我不知道如何将新参数传递给枚举按钮字段。 处理这种情况的正确方法是什么? 到底应该使用这个枚举吗?


Jean Logeart 问题后的澄清:InButtonOutButton 也有一个带有 String 参数的构造函数。 我宁愿避免将其初始化为 null,因为它可能会产生其他问题。

基本上这个问题是如何使用 java 语法模仿 a=f(x) 。大多数时候我能做到:

  1. y = 新 x(); a = 新 f(y);
  2. a = new f(new x());
  3. a = new f(null); a.getF().setX(新x());

这种情况我做不到

两个主要选项。

第一个,InButtonOutButton 也有一个带有 String 参数的构造函数,在这种情况下,您需要在实例化时提供 String

public class InButton extends Button {
    public InButton(String s) {
        super(s);
    }
}
// ...
public enum Signal{
    ON(new InButton("in"))
    // ...
}

第二个选项,InButtonOutButton 是用特定的 String 实例化的,在这种情况下,enum:

中不需要重构
public class InButton extends Button {
    public InButton() {
        super("in");   // default value
    }
}
// ...
public enum Signal{
    ON(new InButton())   // same as before
    // ...
}

我建议完全不要让枚举知道按钮。让他们枚举可能的信号,并将映射信号->按钮的工作放在其他地方:

Function<Signal, Button> signalToButton = ...

这也将使注入不同按钮进行测试变得更加容易;例如,您可以注入一个模拟 Button 来确认它不是我们按下的。

就在您的代码中使用该映射而言:您可以 "install" 映射到某个静态字段,或者更好的是,将其作为构造函数参数提供给任何需要它的代码。依赖注入对后一种选择很有帮助,但那可能是一个更大的变化。