我正在用Java创建一个策略模式。
这是我的策略界面 ActivationStrategy.java :
public interface Strategy {
public void strategyAlgo(JTextField textField);
}
我有不同的类来实现接口。这些类有一个构造函数,因为传递值是必要的。例如:
FirstStrategy.java
public class FirstStrategy implements Strategy{
private JComboBox<String> _comboBox;
public FirstStrategy(JComboBox<String> comboBox) {
_comboBox = comboBox;
}
public void strategyAlgo(JTextField textField) {
textField.addKeyListener(new myKeyHandler(_comboBox, textField));
}
SecondStrategy.java
public class SecondStrategy implements Strategy{
private JPanel _panel;
public secondStrategy(JPanel panel) {
_panel = panel;
}
public void strategyAlgo(JTextField textField) {
addActionHandlerToButton(addButton(_panel));
}
public JButton addButton(JPanel panel) {
JButton button = new JButton("Click me");
panel.add(button);
return button;
}
public void addActionHandlerToButton(JButton okButton) {
Action action = new AbstractAction(){
public void actionPerformed(ActionEvent e) {
System.out.println("Hi");
}
};
button.addActionListener(action);
}
}
现在,我想将这些类作为枚举。 类似的东西:
public enum strategies {
FIRSTSTRATEGIE(){
@Override
public void strategyAlgo() {
...
}
},
SECONDSTRATEGY(){
@Override
public void strategyAlgo() {
...
}
public JButton addButton(JPanel panel) {
...
}
public void addActionHandlerToButton(JButton okButton) {
...
}
};
public abstract void strategyAlgo();
}
但是构造函数呢?
答案 0 :(得分:1)
我enum
的标准是可行的选择吗?
在您的情况下,条件2.
不是true
。因此,在我看来,你不应该将你的策略建模为enum
s。
答案 1 :(得分:0)
您无法在运行时创建枚举的任意实例。因此,您无法将任何内容传递给编译时未知的枚举构造函数。 您可以通过更改抽象方法中的参数列表来传递动态参数。
您可以在Enum中创建构造函数,但它只能是private
,因此您无法在运行时使用它来创建任意实例。
这样可以保证只有一个特定枚举值的实例。
例如:
public enum Suit {
SPADES("spades"),
HEARTS("hearts"),
CLUBS("clubs"),
DIAMONDS("diamonds");
private String label;
private Suit(String label) {
this.label = label;
}
}
BTW,在private
的情况下,enum
关键字对于构造函数是可选的。它默认为private
。