2015-08-22 3 views
0

Я перерабатываю некоторую унаследованную систему, написанную на Java, и я столкнулся с проблемой с конструктором enum.Java, enum with constructor

У меня есть класс перечислимую как это (просто пример):

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)).

Проблема в том, что я не знаю, как передать новые параметры в поле кнопки перечисления. Каков правильный способ справиться с этой ситуацией? Это перечисление должно использоваться вообще?


Разъяснения после Жаной Logeart вопроса: InButton и OutButton также есть конструктор с аргументами через String. Я бы предпочел избежать его инициализации до нуля, потому что это могло бы создать другие проблемы.

В основном этот вопрос заключается в том, как имитировать a = f (x) с использованием синтаксиса java. Большую часть времени я могу сделать:

  1. y = new x(); a = new f (y);
  2. a = новый f (новый x());
  3. a = новый f (null); a.getF(). setX (новый x());

В этом случае я не могу этого сделать.

+0

Я бы сказал, что эта часть кода вообще не нуждается в рефакторе. Это реализация «Singleton» внутри переименования «Signal». –

+0

@LuiggiMendoza, Привет. Это больше похоже на первый вариант, описанный Жаном Логейтом в его ответе, поэтому конструктор по умолчанию без значений больше недействителен в InButton и OutButton. – Neo

+0

Это не рефакторинг в вашем коде, это простое обслуживание. И это очевидное решение здесь. –

ответ

2

I су ggest, не имея перечислений, знает о кнопках вообще. Просто их перечислить возможные сигналы, и поставить работу отображения SIGNAL-> кнопка где-нибудь еще:

Function<Signal, Button> signalToButton = ... 

Это будет также сделать его легче вводить различные кнопки для тестирования; например, вы можете вводить насмешливую кнопку, которая подтверждает, что это наш был не нажат.

Что касается использования этого отображения в вашем коде: вы можете «установить» сопоставление в какое-либо статическое поле или, еще лучше, предоставить его в качестве аргумента конструктора любому коду, который ему нужен.Инъекционная инъекция очень полезна для последнего варианта, но это может быть большим изменением.

+0

Звучит как разумное решение. Я просто прыгнул, что есть более элегантный способ имитировать a = f (g (x)) с использованием синтаксиса java. В большинстве случаев я могу определить y = new g (x) и a = new f (y), или a = new f (new g (x)); в этом случае я не могу этого сделать. – Neo

0

Два основных варианта.

Сначала один, InButton и OutButton также есть конструктор с String аргументом в этом случае вам нужно обеспечить String когда instanciating:

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 
    // ... 
} 
+0

Первый вариант верен, но эта строка ввода неизвестна во время компиляции, это параметр, который программа инициализирует перед доступом к Signal.Values ​​() - например, используя значение из файла свойств. – Neo

+0

Как насчет отказа от '' null'' и добавления сеттера? –

+0

Это немного сложно, некоторые методы в классах кнопок могут быть доступны внешним клиентам в любое время, что означает, что создание кнопки должно быть в один шаг, и я не могу выставить частичную кнопку. – Neo