1

これは、「これは安全か、愚かか、または完全に不要か」という質問です。このコードパターンが妥当かどうかを調べようとしています。

public class SomeClass {

    private String someField;
    // Other fields here omitted for clarity

    private SomeClass() {
        someField = "some initialization goes here";
        // More initialization of omitted fields
    }

    public static void doSomething(MyObject myObject) {

        SomeClass someClass = new SomeClass();

        // Do things with myObject and someClass instance

    }
}

このコードに明らかな(または非自明な)問題がありますか?一般的な目標は、メソッド内のアクティビティの複雑さをコード内の他の場所から分離することでしたが、柔軟性のためにクラスを開いdoSomethingたままにしておくことでした。SomeClass多分?

このようなもので同時実行/同期の問題はありますか?

非常にあいまいなサンプルコードをお詫び申し上げます。

4

2 に答える 2

2

この概念では、同時実行や同期の問題は発生しません。静的メソッドを呼び出すたびに、の個別のインスタンスが存在するためSomeClass、複数のスレッドが同時に値にアクセスすることはありません。

このデザインパターンの実現可能性については、妥当なパターンだと思います。このようなパターンを実装するJavaAPIクラスは考えられませんが、見つかった場合は、この回答に追加します。通常、オブジェクトを使用せず、代わりに静的メソッドのバンクを提供するプライベートコンストラクターを持つクラスが表示されますが、実際には、実行していることを実行しない理由はありません。

于 2012-10-20T15:35:07.933 に答える
0

あなたがそれを使用している方法はmix-upstatic factories通常のobject creationです。したがって、あなたの場合、あなたは何も持っていませんconcurrency issue

ただし、それでも、について知りたいと仮定するとstatic factory、クラスの単一インスタンスをローミングする場合、またはそれらを使用して任意のサブタイプのインスタンスを返す場合に備えて、静的ファクトリを使用することをお勧めします。

それは本の最初の項目です:-Effective Javaつまり、Consider static factory methods instead of constructors

その項目にリストされている利点からの引用は次のとおりです。

静的ファクトリメソッドの利点の1つは、コンストラクタとは異なり、名前が付いていることです。コンストラクターへのパラメーター自体が、返されるオブジェクトを記述していない場合は、適切に選択された名前の静的ファクトリを使用する方が簡単です。

static methodsだから、あなたは彼らが何をするかを示す彼らの名前でさまざまな種類を持つことができます。EGの場合:-

  • getInstance()通常、既存のインスタンスを返すために使用する必要があります
  • newInstance()すべての呼び出しで新しいインスタンスを作成するために使用する必要があります

したがって、singleton実装は次のようになります。-

public class Demo {
    private static Demo demo = new Demo();

    private Demo() {
    }

    public static Demo getInstance() {
        return demo != null? demo: new Demo();
    }
}
于 2012-10-20T15:32:31.070 に答える