Javaで静的インスタンスを使用するのは合理的ですか?

私は実際にgoogleでこの質問への答えを見つけることができなかったので、ここに行く。

Staticオブジェクトを使用してプログラムの残りの部分がオブジェクトを参照できるようにしても構いませんか? 私は自分の質問を明確にする方法を正確には分かっていないので、サンプルコードを示します。

public class Client {

    Frame f;
    private static Client mainClient;

    public static void main(String[] args){
        new Client().init();
    }

    private void init(){

        mainClient = this;
        f = new Frame();

    }

    public static Client getClient() {
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

ですから、作成したオブジェクトの(ほとんどの)オブジェクトにパラメータとして送信するのではなく、プログラム全体でgetClient()メソッドを使用してFrameオブジェクトにアクセスすることは容認できますか?フレームはプログラム全体で使用され、パラメータとして追加するだけで各コンストラクタに1つのパラメータが追加されます。

ありがとう

4
@ Jtvd78短い答えは、これは絶対に受け入れられることです。スレッドを使用している場合は、スレッドセーフについて注意してください。
追加された 著者 emesx,
実際には「静的インスタンス」などは存在しないことに注意することが重要です。静的な変数がありますが、オブジェクトは本質的に静的ではありません。
追加された 著者 Jon Skeet,
明確にするために、クライアントのインスタンスは1つしかなく、これはフレームのインスタンスを1つだけ作成します。それはプログラム全体を通してです。スレッドセーフティについては、なぜこれがスレッドセーフではないかを誰かが明確にすることができますか?また、データモデルを共有する方が良い方法かもしれないと述べました。そして私はそれをオプションとして検討します
追加された 著者 Jtvd78,
1)このアプリケーションの存続期間中に常に正確に1つのフレームが存在するかどうか、2)プログラムのすべての部分が実際にフレーム全体にアクセスする必要があるかどうか、3)データモデルを共有する必要があるかどうかフレームではなく
追加された 著者 Andy Thomas,

8 答え

複数のことに依存する...

1)使用状況 MyClass.getClient()を呼び出してClient変数への参照を取得できるようにしたいですか? あなたがシングルトンのものを目指しているなら - はい。あなたが非常に便利なものを目指しているなら、安全であればはい、どこでも見えるようにすればいいのです。間違った場所や時間からアクセスすると、クラッシュやバグが発生します。

2)人は、あなたが公開している期間を使用します。そのようなクライアントを取得するコードが表示された場合、不適切な場合にもそのコードを使用するため、多くのバグが発生します。 :)

3)デザイン本当に必要ですか?いつでも絶対にアクセスできるよりも、引数のようにそれを渡す方がクリーンですか?

それらを測定した後、あなたが決める。これはビルドして正常に動作するように見えます。しかし、このような制限のないアクセス(上記のアクセスはいつでも実行時の詳細にアクセスする必要があるもの)は最良の方法ではないかもしれません。宿題のために働くものはエンタープライズソフトウェアではないかもしれません。

6
追加された
+1:エンタープライズソフトウェアではない宿題の場合これは純粋な金です。
追加された 著者 Luiggi Mendoza,

あなたの場合、シングルトンパターンを使用するのがよいかどうかを理解するには、「アプリケーションの存続期間中、コンポーネントは同じままですか?」と尋ねる必要があります。もしそうなら、おそらくクラス内でそれを分離するほうがよいでしょう。

1
追加された

あなたが記述していることは、シングルトンパターンと呼ばれています。いくつかの批評家がいるが、頻繁に使用されるパターンである。

あなたのオブジェクトをすべてのコンストラクタに与えるもう1つの方法は、依存性注入フレームワークです。 Javaの場合は、 Spring が最適です。

1
追加された
Springの代替手段として、 guice をお勧めします。
追加された 著者 mariosangiorgio,
Java EE 5+環境でSpringとGuiceの両方に代わる@mariosangiorgioとして、EJB 3および/またはCDIを使用することをお勧めします。
追加された 著者 Luiggi Mendoza,

SingleTonパターンのバリエーションを作成しました。静的オブジェクトは、プロジェクト全体でそのオブジェクトのインスタンスが1つだけ必要な場合に使用されます。

シングルトンの基本構造は次のとおりです。

public class Client {
    private static Client mainClient;


    private void Client (){
        //do initial tasks
    }

    public static Client getClient() {
        if(mainClient == null)
            mainClient = new Client();
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

あなたはフレームを使用して取得することができます

Client.getClient().getFrame();
0
追加された
彼が正確に1つのインスタンス、またはアクセスの容易さを望んでいるかどうかわからない、それは事だ....
追加された 著者 Shark,

静的インスタンスを使用することは、定数/不変オブジェクトに対しては全く問題ありません。

可変オブジェクトに関しては、それは依存する。 1つのスレッドを持つ単純なプログラムでは、うまくいきます。ただし、マルチスレッドまたはクラスタ化されている場合は、シングルトンを注意して使用するか、まったく使用しないでください。

0
追加された

It is ok to do that. It would be helpful for you to read about singleton pattern

0
追加された
「OK」は少しオーバーサイズです。ほとんどの場合、シングルトンは今日ではむしろ広くアンチパターンであると考えられています。ほとんどの場合、人々はどこで使用すべきか知るべきではない、使用すべきではないことを知りがちで、すべてをシングルトンに変えてしまいます。 :P
追加された 著者 cHao,

さて、このシングルトンパターンの実装は、私が最も嫌うパターンです。さて、それをコード化するのは本当に簡単ですが、後で何かを変更しなければならない場合は、何百万もの場所で変更する必要があります。シングルトンパターンの場合は、シングルトンファクトリパターンで依存性注入 - 制御の反転パターンを使用し、定数(例えば、文字列、整数など)。

あなたの質問に関しては、すべてが受け入れられます。実装はプロジェクトの要件によって異なります。

0
追加された
@アンドレは、エンタープライズソフトウェアでは宿題ではないかもしれませんし、逆もそうです。
追加された 著者 Shark,
@アンドンド:それはあなたの右の言葉です - あなた。いくつかのケースでは、コースの先生/ TA、他のいくつかのケースでは - 厳密なガイドラインとコードに触れていないマネージャーの監督の下で生成されたあなたの部門のコードを買った無縁のクライアント...すべてが受け入れられる、 :D
追加された 著者 Shark,
@André:はい、すべての構造とコンセプトは、ある意味でいくつかの用途を持っています。それがなければ、それは存在しないだろう。大きな問題は、特定の概念が有用なコンテキストを知ることです。
追加された 著者 cHao,
"すべてが受け入れられる" ???
追加された 著者 André Stannek,
何らかの使用をしてもそれが受け入れられるというわけではありません。私はそれが文脈に依存していることに同意しますが、あなたが受け入れるとは考えないプログラミングでできることもたくさんあります。
追加された 著者 André Stannek,

基本的にシングルトンパターンを使用するのがいいかどうかを尋ねています。もちろんそうだ。しかし、問題は GUI以外のスレッドでGUIのことをしないようにする必要がありますです。 Frameクラスへのアクセスを許可することにより、可能性のある濫用のためにそれを開きます。私はあなたが唯一のプログラマだと仮定しているので、あなたがそれをどのように扱うかに注意してください。

0
追加された