[英]Java, enum with constructor
我正在重构一些用Java编写的遗留系统,但遇到了枚举构造函数的问题。
我有一个这样的枚举类(仅作为示例):
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)。 大多数时候我可以做:
在这种情况下,我做不到。
我建议完全不要让枚举数了解按钮。 只是让它们枚举可能的信号,然后将映射信号->按钮的工作放在其他位置:
Function<Signal, Button> signalToButton = ...
这也将使注入不同的按钮进行测试变得更加容易。 例如,您可以注入模拟的Button,以确认没有按下我们的按钮。
至于在代码中使用该映射:您可以“安装”到某个静态字段的映射,或者更好的是,将它作为需要它的任何代码的构造函数参数提供。 依赖注入对后一种选择非常有帮助,但这可能是一个更大的变化。
两个主要选项。
第一个, 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
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.