2011-12-27 9 views
5

私はシングルトンクラスを持っています。スタティックメソッドを使ってシングルトンのフィールドにアクセス

クラスのメソッドにアクセスするとき、私は2つの可能性の中から選択します。

  1. 静的としてこれらのメソッドを作成し、それらを呼び出すと、彼らは、例えば、インスタンスに

を取得するインスタンスを取得し、

  • それらを呼び出し、特定のインスタンスとしてこれらのメソッドを作成して:

    Class Test{ 
    
    private int field1; 
    
    Test instance; 
    
    private Test(){}; 
    
    private Test getInstance(){ 
        if (instance == null) 
         instance = new Test(); 
        return instance; 
    } 
    
    public int method1() { return field1;} 
    public static int method2() {return getInstance().field1;} 
    } 
    

    ここでは他にも書くことができます

    int x = Test.getInstance().method1(); 
    int y = Test.method2(); 
    

    どちらが良いですか? 私は静的メソッドで直接 "インスタンス"を使用し、それがヌルである場合に例外を捕捉し、それをインスタンス化してから再度呼び出す3番目の代替方法について考えることができます。

    私は、理論的には、ロット全体を静的にすることができます。 しかし、これは、シリアライゼーションが静的を保存しないので、アクティビティクローズ時に状態を保存するときに問題が発生します。

  • +0

    'method2()'が静的メソッドであるという事実を伝えるので、私は 'Test.method2();'に行きます。 – TheVillageIdiot

    答えて

    2

    私は最初のものがよりクリーンだと思います。

    しかし、いくつかの極端なケースでは、Androidが静的インスタンスを強制終了する可能性があることに注意してください。これはたとえばhttp://code.google.com/p/acra/を参照してください。

    回避策これについては、Applicationクラスからのシングルトンへの参照を保持することもあります。しかし、私はどのように問題を証明しているのか分かりません。

    +0

    あなたが "殺す"と言うとき、あなたは活動が閉鎖されていると話していると思います。 – theblitz

    +1

    いいえ、私は静的インスタンスが破棄されているという話です。アクティビティが消滅したときに驚くべきことではありません。静的インスタンスが死んだときは非常に驚くべきことです。Javaでは起こりません。 – zmbq

    2

    すべてを静的にしないでください。シングルトンが行われていないと言う人もいます。

    +0

    私は場所の全負荷からそれを必要とし、同じものでなければならないので、シングルトンでなければなりません。 – theblitz

    +0

    次に、 "int x = Test.getInstance()。method1();"と進んでください。なぜなら、field1は静的ではないからです。 – ChristopherS

    0

    静的メソッドを持つ私の個人的意見では、最初は悪いデザインです。もちろん、プログラム自体に依存しますが、クラスに静的メソッドを持たせることは、デザイン全体に影響を与えます。私の文の背後にあるいくつかの理由:静的メソッドは簡単にいくつかのオブジェクトの状態を変更することができる場合

    1. 、遅かれ早かれバグが
    2. を出てくる、あなたのプログラムで静的メソッドを公開する場合、それを使用するすべてのクライアントがありますあなたのコードに非常に強い依存関係。このメソッドをいつでも削除または変更することに決めたら、クラスを使用したすべてのクライアントを破棄します。

    ですので、ですので、避けてください。

    何らかの理由で静的メソッドを要求している場合は、の方が最初の解決方法が良いと思われます。それがシングルトンの仕組みです。静的メソッドを使用してSINGLETON OBJECTへの参照を取得する必要がありますが、このオブジェクトはオブジェクト指向プログラミングのすべての原則に従って使用されるである必要があります。

    +0

    (1)静的メソッドは、オブジェクトの状態を変更しない操作にのみ使用する必要がありますが、静的メソッドを完全に禁止する理由ではありません。 (2)これは静的な方法だけでなく、すべての公的方法の批判です。相互作用を完全に失うことなく2つのクラスをどの程度分離できるかには限界があります。 –

    2

    シングルトンパターンの全体のポイントは、あなたが実装を変更することができるということです。ほとんどの場合、この機能の他の実装では、後で "フック"する可能性を保つために使用します。

    読み取り:getInstanceの場合だけでなく、setInstanceメソッドのシングルトンプランを決定するとき。 - これが理にかなっていない場合は、単なる静的なクラスを使用してください。

    シングルトンは、ヒップとすべてのものになりたい場合は、シーズン外です。 「グローバル状態を削除する」を検索してください。 Googleが後援した話もある。つまり、あなたのコードはよりテスト可能になり、依存関係の混乱を避けることができます。 (股関節とすべてのことのほかに、間違いなく正しい方向への一歩です)。

    関連する問題