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 问题后的澄清:InButton
和 OutButton
也有一个带有 String
参数的构造函数。
我宁愿避免将其初始化为 null,因为它可能会产生其他问题。
基本上这个问题是如何使用 java 语法模仿 a=f(x) 。大多数时候我能做到:
- y = 新 x(); a = 新 f(y);
- a = new f(new x());
- a = new f(null); a.getF().setX(新x());
这种情况我做不到
两个主要选项。
第一个,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
// ...
}
我建议完全不要让枚举知道按钮。让他们枚举可能的信号,并将映射信号->按钮的工作放在其他地方:
Function<Signal, Button> signalToButton = ...
这也将使注入不同按钮进行测试变得更加容易;例如,您可以注入一个模拟 Button 来确认它不是我们按下的。
就在您的代码中使用该映射而言:您可以 "install" 映射到某个静态字段,或者更好的是,将其作为构造函数参数提供给任何需要它的代码。依赖注入对后一种选择很有帮助,但那可能是一个更大的变化。
我正在重构一些用 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 问题后的澄清:InButton
和 OutButton
也有一个带有 String
参数的构造函数。
我宁愿避免将其初始化为 null,因为它可能会产生其他问题。
基本上这个问题是如何使用 java 语法模仿 a=f(x) 。大多数时候我能做到:
- y = 新 x(); a = 新 f(y);
- a = new f(new x());
- a = new f(null); a.getF().setX(新x());
这种情况我做不到
两个主要选项。
第一个,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
// ...
}
我建议完全不要让枚举知道按钮。让他们枚举可能的信号,并将映射信号->按钮的工作放在其他地方:
Function<Signal, Button> signalToButton = ...
这也将使注入不同按钮进行测试变得更加容易;例如,您可以注入一个模拟 Button 来确认它不是我们按下的。
就在您的代码中使用该映射而言:您可以 "install" 映射到某个静态字段,或者更好的是,将其作为构造函数参数提供给任何需要它的代码。依赖注入对后一种选择很有帮助,但那可能是一个更大的变化。