2017-04-12 18 views
0

私は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 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

クラスにフィールドが必要ですか?あなたはパネル/コンボボックスをstrategyAlgoメソッドに直接渡すことはできませんか? – assylias

+0

しかし、すべての戦略がパネルまたはコンボボックスを必要とするわけではありません。 – LCP

+0

私はあなたがそれらの列挙型にしたい場合、あなたの現在の戦略オブジェクトは既にシングルトンだと仮定します。そうですか? – Zircon

答えて

0

実行時に任意のenumインスタンスを作成することはできません。したがって、コンパイル時には知られていない列挙型のコンストラクタには何も渡すことはできません。 抽象メソッドで引数のリストを変更することで動的引数を渡すことができます。

コンストラクターはEnumで作成できますが、privateのみであるため、実行時に任意のインスタンスを作成するために使用することはできません。 このようにして、特定のenum値のインスタンスが1つしか存在しないことが保証されます。例えば

public enum Suit { 
    SPADES("spades"), 
    HEARTS("hearts"), 
    CLUBS("clubs"), 
    DIAMONDS("diamonds"); 

    private String label; 

    private Suit(String label) { 
    this.label = label; 
    } 

} 

ところで、privateキーワードenumの場合のコンストラクタのためのオプションです。デフォルトではprivateです。

+0

しかし、外部の値や参照を渡すことはできません。列挙型の初期化中に既に知られている定数のみです。それはOPの場合には役に立たない。 – f1sh

1

私の基準はenumですか?

  1. コンパイル時にインスタンス数が決定された場合。
  2. 各インスタンスの状態がコンパイル時に決定されるとき。
  3. インスタンスが可変状態を保持していない場合。

ケース基準では、2.trueではありません。従って私の意見では、あなたの戦略をenumとモデル化すべきではありません。

+0

私は* Java * 'enum'を修正しましたが、' enum'は* Enumeration *の略です。私は自分のテキストフォーマットがオフであったと思う。 – Harmlezz

関連する問題