2

シングルトン パターンの次の 2 つの実装を見ていました。

 Class Customer {

int x;
static int count = 0;

private Customer()
{
    x = 1;
}

public static Customer GetCustomer()
{
    if(count==0)
    {
        count++;
        return new Customer();
    }
    else
    {
        return null;
    }
}
}

クラスがすでに一度インスタンス化されている場合、コンストラクターが呼び出されない実装 1。また

 Class Customer{

int x;
static int count = 0;
public Customer()
{
    if(count == 0)
    {
        x = 1;
        count++;
    }
    else
    {
        return;
    }
}

クラスがすでに一度インスタンス化されているかどうかに関係なく、コンストラクターが呼び出される実装 2。オブジェクトが2回目にインスタンス化されていないにもかかわらず、コンストラクターにメモリを割り当てるため、実装2は推奨されないというビデオレクチャーをオンラインで見ました。Java には自動ガベージ コレクションがあることは承知していますが、ビデオ レクチャーで見た内容が関連しているかどうかを知りたかっただけです。

4

2 に答える 2

6

シングルトンの実装はどれも正しいものではないと言う人もいますが、私はその陣営には完全に属していません。

人々はしばしばそれらを悪用する傾向があります(たとえば、神のオブジェクトとして)が、それでも彼らの場所はあります(私の意見では、この答えとはほとんど関係ありません).

この回答の目的のために、シングルトンが必要であるという正しい決定を下したと仮定しますが、その潜在的な問題について読むことを強くお勧めします-あなたの目的を達成するためのより良い方法があるかもしれません.


そうは言っても、コードサンプルがとにかく正しいかどうかはわかりません。シングルトンは 1 つのインスタンスのみを返し、必要に応じてインスタンスを作成し、そうでない場合は以前に作成されたインスタンスを返します。

あなたの最初のコードサンプルがその契約をどのように尊重するかわかりません。最初に呼び出されたときに新しいものを提供し、その後は何も提供しません。

そして、2 番目のコード サンプルは、複数のオブジェクトをまったく防止していないようです

ですから、これが彼らが提供する教育の質である場合、あなたがそのビデオを見続けたいかどうかについて、私は非常に慎重に考えています.


いずれにせよ、そのクラスのオブジェクトは 1 つしかないと想定されているため、一度だけ構築するものを好みます。つまり、競合状態を防止して複数のオブジェクトを作成できるように適切に同期され、最初に新しいオブジェクトを作成し、後続の呼び出しで同じgetMe()オブジェクトを返す静的呼び出しです。Me

疑似コードでは、次のようになります。

class Me {
    private Me() {};

    private static Me *loner = NULL;

    public static synchronised Me *getMe() {
        if loner == NULL
            loner = new Me();
        return loner;
    }
}
于 2012-09-04T01:50:11.367 に答える
0

正しいシングルトンを書くのはそれほど簡単ではありません。競合状態に注意し、リフレクション攻撃から防御する必要があります。たとえば、リフレクションを介してプライベート コンストラクターを呼び出して、オブジェクトのインスタンスをもう 1 つ作成することができます。Java での最も簡単で安全なシングルトンの実装は、列挙型を使用して行われます。

enum Singleton {
    INSTANCE;
}

これは、enum 定数が JLS によってシングルトンとして指定されているためです (JLS のセクション 8.9)。

列挙型には、その列挙型定数によって定義されたもの以外のインスタンスはありません。

于 2012-09-04T04:57:23.090 に答える