適切なシングルトン設計?

java methods singleton static
適切なシングルトン設計?

_
可能性の重複:Javaでのシングルトンパターンを実装する + Efficient方法
_

アプリケーションの状態セーバーとして機能するシングルトンクラスがあります。 たとえば、データがあるビューがある場合、データを保存済み状態のシリアル化可能なオブジェクトにパッケージ化し、後で取得するためにシングルトンに渡します。 これはすべて自然で適切に思えますが、http://en.wikipedia.org/wiki/Singleton_pattern [Wiki]のシングルトンの例から外れています。 インスタンスを取得し、インスタンスを介してメソッドを呼び出すことができるインスタンス取得メソッドを使用する代わりに、すべてのメソッドを静的に設定し、クラスを静的に使用します。

これは悪い形ですか? パフォーマンスの低下はありますか?

ヒントをありがとう〜Aedon

  2  0


ベストアンサー

静的な使用があなたのニーズを満たすなら、私はそれに悪を見ない。

唯一の欠点は、柔軟性がわずかに低いことです。 実際のシングルトンとして設計した場合は、状態を管理するためのインターフェイスを用意し、特定の状況に合わせて特定の実装をインスタンス化できます。 次に、このオブジェクトを引数としてアプリケーションに渡すことができます。

厳密に静的なクラスを使用する場合、渡すオブジェクトはありません。そのため、Classオブジェクトを渡し、そのインターフェイスを介して関数にアクセスすることに頼らなければなりません。

もちろん、これはすべて、現在のクラスの合理的な能力を超えて拡大する可能性がある場合にのみ重要です。

4


はい、それは悪い形と見なされます。

Javaの静的クラスには、作業が困難になる多くの問題があります。 たとえば、インターフェイスを実装することはできません。 また、通常のシングルトンにする必要がある場合、または頻繁に発生する非シングルトンにする必要がある場合は、相互作用するコードのすべての行を書き換える必要があります。

4


はい、静的メソッドと変数のみを使用することはオブジェクト指向の方法ではありません。 シングルトンは、ほとんどの場合、悪い習慣と見なされます。 しかし、私はそれらが時々非常に役立つことを認めています。 有効で機能的なシングルトンクラスを作成する方法の簡単な例を次に示します。 他の方法もありますが、これは最も一般的な方法の1つであることに注意してください…​

public class Singleton {
   private static final Singleton uniqueInstance;

   public static synchronized Singleton getInstance() {
     if (Singleton.uniqueInstance == null) {
       Singleton.uniqueInstance = new Singleton();
     }
     return Singleton.uniqueInstance;
   }

   //other methods go here...

   @Override
   protected Singleton clone() throws CloneNotSupportedException() {
     throw new CloneNotSupporedException("cloning of singleton is not supported");
   }

   //hide constructor for others to see
   private Singleton() {
   }
}

乾杯、P

1


https://stackoverflow.com/questions/427902/java-enum-singleton [シングルトンの代わりに列挙を使用]。 最も安全な方法です。

0


オブジェクト指向のスタイルではないため、悪い形式と見なされます。 とにかく、多くの人はシングルトンを貧弱な形と考えています。 率直に言って、あなたがやろうとしていることに対してはうまく機能します。 これをレビューや評価のために提示するつもりがない限り、そのままにしておきます。

静的クラスとしてのパフォーマンスが向上する可能性があります。

0


@Borisのコメントに追加します。必要なのがユーティリティクラスだけの場合は、列挙型を使用するとさらに簡単になります。

public enum Utility {
    ; // no instances
    public static Object myStaticMethod(Object ... args) { }
}

実装するインターフェースがある場合、これは意味があります。 注、列挙型で複数のシングルトンを作成できます

public enum Callables implements Callable {
    HELLO {
         public String call() { return "Hello"; }
    },
    WORLD {
         public String call() { return "World"; }
    }
}

注:HELLOとWORLDはスーパークラスCallableを共有しますが、実際には異なるクラスがあります。

0


タイトルとURLをコピーしました