Java,枚举与构造函数

时间:2015-08-22 19:58:07

标签: java enums refactoring

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

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

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 = new x(); a = new f(y);
  2. a = new f(new x());
  3. a = new f(null); a.getF()。setX(new x());
  4. 在这种情况下,我无法做到。

2 个答案:

答案 0 :(得分:2)

我建议根本没有关于按钮的知识。让他们枚举可能的信号,并将map_>按钮的工作放在其他地方:

Function<Signal, Button> signalToButton = ...

这也可以更容易地注入不同的按钮进行测试;例如,你可以注入一个模拟按钮,确认它是我们没有按下的。

至于在代码中使用该映射:您可以将映射“安装”到某个静态字段,或者更好的是,将其作为构造函数参数提供给任何需要它的代码。依赖注入对后一种选择非常有帮助,但这可能是一个更大的变化。

答案 1 :(得分:0)

两个主要选项。

第一个,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
    // ...
}