[英]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.