簡體   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