3

私はこれに関する投稿を読んだので、静的変数を回避する方法を知っています。それらはオブジェクト指向ではなく、グローバルなどのようなものです。

しかし、ここに私の質問があります。繰り返しではないことを願っています。多くのメソッドが使用するプライベートクラス変数がいくつかあり、渡すのは面倒です。私が話しているクラスは私のメインプログラムなので、そのインスタンスはJVMが作成するインスタンスだけになります。

この場合、これらの変数が静的であるかどうかに違いはありますか?(おそらく、ユーザーが私のアプリケーションを複数回開いて、変数を静的にすると、それらは変数を共有し、互いに混同しますか?)

列挙型の内部からこれらの変数にアクセスしたいので、静的変数を使用したいと思います。ありがとう

列挙型部分のコードは次のとおりです。

enum Buttons {

    OPEN_BUTTON("Open file...",false),
    CHANGE_FONT_BUTTON("Change font",false),
    DECOR_BUTTON("Decor font",true),
    EDITOR_BUTTON("Open editor",false),
    ALPHABET_BUTTON("Open alphabet browser",false),
    CTEST_BUTTON("Start consonant test",false),
    TESTTYPE_BUTTON("Select test type...",false),
    TEST_BUTTON("Start word test",false),
    QUIT_BUTTON("Quit", false);

    private ButtonBase button;

    Buttons(String title, boolean toggle) {
        if (toggle) button = ToggleButtonBuilder.create().prefWidth(200).prefHeight(35).text(title).build();
        else button = ButtonBuilder.create().prefWidth(200).prefHeight(35).text(title).build();}

    void onClick(EventHandler<MouseEvent> eh) {button.setOnMouseClicked(eh);}
    ButtonBase getBase() {return button;}
    boolean toggled() { return ((ToggleButton)button).isSelected();  }
    void setToggle(boolean on) {((ToggleButton) button).setSelected(on); }
    void enable() {button.setDisable(false);}
    void disable() {button.setDisable(true);}
    void setText(String text) { button.setText(text);}
    void clicked() {

//これは、イベントハンドラーが必要な場所です...

4

3 に答える 3

4

あなたは次のように述べています。

私はJavaFxを使用していて、ボタンを列挙型にしています。列挙型内にActionEvent(クリック)ハンドラーを追加したいので、すべてが1か所にきちんとまとめられています。ハンドラーはクラス変数にアクセスする必要があります。

これは適切な設計ではなく、静的変数の理由でもありません。また、列挙型の誤用でもありません。あなたはこのデザインでOOPのすべての利点を捨てているので、私はあなたにこれをしないように強く勧めます。コードを更新または変更する場合、GUIコンポーネントを変更することが多く、列挙型は(ほとんど)変更されないことに注意してください。それらは、ロジックの不変の基盤を表す必要があります。ボタンのように状態が変化するオブジェクトには使用しないでください。

また、GUIコンポーネントにこれを使用する必要がないため、ここではシングルトンパターンを使用しないことをお勧めします(実際、シングルトンは列挙型に非常に似ています)。単純にViewクラスを作成してみませんか?

于 2013-03-08T23:20:35.290 に答える
2

同じデータをたくさん渡していることに気付いた場合、そのデータにはある程度の相関関係があるように思われます。おそらく、そのデータをある種の値オブジェクトにカプセル化することで、グローバルデータを効果的に使用する必要がないのでしょうか。

于 2013-03-08T23:16:04.727 に答える
-1

単一のクラスローダー内では、静的フィールドは常に共有されます。データをスレッドに明示的にスコープするには、ThreadLocalなどの機能を使用する必要があります。

リンク

したがって、ThreadLocalで統計を使用する場合、アプリの複数のインスタンスで問題が発生することはありません。

于 2013-03-08T23:20:12.827 に答える