1

JavaFXでSingletonメイン クラスを作成したいのですが、メイン クラスがApplicationを拡張する必要があるため、コンストラクターをプライベートにすることができないため、問題が発生しています。

任意のクラスからいくつかのインスタンス メソッドにアクセスしたいので、メイン クラスをシングルトンにしたいと考えています。

現在のコードでは、コードの一部でクラスが再度インスタンス化されないという保証を提供しないため、メイン クラスを偽のシングルトンとして使用しています。

プライベート コンストラクターを使用できない場合にシングルトンを作成する適切な方法があるかどうかを知りたいです。

これが私のメインクラスのコードです:

public final class MainClass extends Application {
    private static MainClass instance;
    private Stage primaryStage, optionsStage;

    @Override
    public void start(final Stage primaryStage) {
        instance = this;
        try {

            // Main scene.
            {
                Parent page = (Parent) FXMLLoader.load(
                        MainWindowController.class.getResource("main.fxml"));
                Scene mainScene = new Scene(page);
                primaryStage.setScene(mainScene);
                primaryStage.show();
            }

            // Options scene.
            {
                optionsStage = new Stage();
                optionsStage.setTitle("Options");
                optionsStage.setResizable(false);
                optionsStage.initModality(Modality.APPLICATION_MODAL);
                optionsStage.initOwner(primaryStage);

                Parent page = (Parent) FXMLLoader.load(
                        OptionsWindowController.class.getResource("options.fxml"));
                Scene scene = new Scene(page);
                optionsStage.setScene(scene);
            }

        } catch (Exception ex) {
            Constants.LOGGER.log(Level.SEVERE, ex.toString());
        }
    }

    /**
     * Returns the instance of this class.
     * @return
     */
    public static MainClass getInstance() {
        return instance;
    }

    public Stage getPrimaryStage() {
        return primaryStage;
    }

    /**
     * Returns the options stage.
     * @return
     */
    public Stage getOptionsStage() {
        return optionsStage;
    }

    /**
     * The main() method is ignored in correctly deployed JavaFX
     * application. main() serves only as fallback in case the
     * application can not be launched through deployment artifacts,
     * e.g., in IDEs with limited FX support. NetBeans ignores main().
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}
4

1 に答える 1

4

私はJavaFXに精通していませんが、次のようなパブリックコンストラクターを追加instance = this;し、メソッドの割り当てを削除することでうまくいくと思います。メインクラスを複数回インスタンス化しようとすることstartはないと思いますが、APIがそのような保証を行わない場合は、後で問題が発生する可能性があります。

いずれにせよ...次のようなことをすると、すぐに気が付くでしょう。

public MainClass(){
    super();
    synchronized(MainClass.class){
        if(instance != null) throw new UnsupportedOperationException(
                getClass()+" is singleton but constructor called more than once");
        instance = this;
    }
}

NetBeansのコンパイラ(使用している場合)は「リーク」について泣き言を言いますthisが、これにより、コンストラクタを2回以上実行して完了することが保証されます。

于 2012-12-19T00:47:17.980 に答える