我正在重构一些用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提问之后澄清:InButton
和OutButton
也有一个带String
个参数的构造函数。
我宁愿避免将它初始化为null,因为它可能会产生其他问题。
基本上这个问题是如何使用java语法模拟a = f(x)。我大多数时间都可以这样做:
在这种情况下,我无法做到。
答案 0 :(得分:2)
我建议根本没有关于按钮的知识。让他们枚举可能的信号,并将map_>按钮的工作放在其他地方:
Function<Signal, Button> signalToButton = ...
这也可以更容易地注入不同的按钮进行测试;例如,你可以注入一个模拟按钮,确认它是我们没有按下的。
至于在代码中使用该映射:您可以将映射“安装”到某个静态字段,或者更好的是,将其作为构造函数参数提供给任何需要它的代码。依赖注入对后一种选择非常有帮助,但这可能是一个更大的变化。
答案 1 :(得分:0)
两个主要选项。
第一个,InButton
和OutButton
也有一个带String
参数的构造函数,在这种情况下,您需要在实例化时提供String
:
public class InButton extends Button {
public InButton(String s) {
super(s);
}
}
// ...
public enum Signal{
ON(new InButton("in"))
// ...
}
第二个选项InButton
和OutButton
与特定String
实例化,在这种情况下,enum
不需要重构:
public class InButton extends Button {
public InButton() {
super("in"); // default value
}
}
// ...
public enum Signal{
ON(new InButton()) // same as before
// ...
}