繁体   English   中英

Java,带有构造函数的枚举

[英]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问题后的澄清: InButtonOutButton也具有带有String参数的构造函数。 我宁愿避免将其初始化为null,因为它可能会引起其他问题。

基本上,这个问题是如何使用Java语法模拟a = f(x)。 大多数时候我可以做:

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

在这种情况下,我做不到。

我建议完全不要让枚举数了解按钮。 只是让它们枚举可能的信号,然后将映射信号->按钮的工作放在其他位置:

Function<Signal, Button> signalToButton = ...

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

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

两个主要选项。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM