2011-05-24 9 views
0

シングルトンデザイン&新しいオブジェクト内部のそれここに具体的なシナリオでは

私はマネージャーがUserMangerは、設計によって、ユーザー

このマネージャーは、「シングルトン」で、正しいのためのCRUDを処理するために使用されると呼ばれています。

しかし、更新方法では、私はロジック

public User update (User u) 
{ 

    // This line is problematic? 
    User u1 = new User(); 

    copy(u,u1); 
    //Some logic 
    dao.update(u); 

} 

が問題シングルトンマネージャ内の任意の新しいオブジェクトを作成するのでしょうか?特に、非常に並行したシステムの場合。

public User update (User u, User u1) 
{ 

    copy(u,u1); 
    //Some logic 
    dao.update(u); 
} 

は私の問題を解決するのでしょうか?

+0

uとu1には、ユーザークラスのオブジェクトである – developer

+0

が含まれています。ユーザークラスは、名前、年齢などのユーザープロパティのゲッターとセッターを持つシンプルなものです。 –

答えて

4

シングルトンメソッド内にオブジェクトを作成しても問題は発生しません。結局のところ、スレッド間で状態を共有しているわけではありません。

あなたはシングルトン自身の中の状態を持っていた場合は、潜在的な問題を持っているでしょう - しかし、あなたは示されてきたすべてがインスタンス変数を変更しない、ローカル変数を作成しています。メソッドを呼び出すたびに、独自の完全に独立したローカル変数のセットがあります。 2つのスレッドはどちらも同じメソッドを実行できますが、お互いのローカル変数は表示されません。

+0

これは、u1.setId(u.getId())のようなものを変更した場合、これを意味するはずです。または、u1.generateXYZ(u.getID());それは問題になるでしょうか? –

+0

@Amol:いいえ、それはまだシングルトン内の状態ではありませんか? –

+0

@Jonしかし、内部で新しく作成されたオブジェクトの値は、パラメータ化されたオブジェクトを使用して設定されているので、このようなロジックを使用すると問題になると思いますか? –

0

号しかし、あなたはグローバル変数として

User u1; 

を置けば、それは問題が発生します。

しかし、私は質問があります。なぜあなたはこのようにコードしていませんか?

public User update (User u) 
{ 

    //Some logic 
    User u = dao.update(u); 
    return u; 
    // OR return dao.update(u); 
} 

ここにコピーする必要はありません。このメソッドでは、コピーに2倍のUserオブジェクトが割り当てられる必要があります。

+0

Javaでは*グローバル変数*と呼ばれていません。 ;)* Field *、* attribute *、* property *(sans getterとsetterメソッド)、または* class変数*はより一貫性のある名前です。 – Spoike

+0

はい。ここでは一般的なケースで正しいですが、ここではコピーはビジネスロジックの一部なので、避けることはできません。しかし、オブジェクトを作成してそのような更新メソッドの内部で使用すると、内部で新しく作成されたオブジェクトの値がパラメータとして渡されるオブジェクトの値によって影響を受ける場合、問題が発生しますか? –

+0

@Amol:いいえ、それは安全です。 – Rudy

0

システムを理解していないと、ここに記載されているデザインパターンについて質問する必要があります。 SingletonSomethingManagerはどちらもアンチパターンです。

、本質的に何をしている(あなただけのUserManagerのために、より説明的な名前を検討する必要があるかもしれませんが、それはむしろ必要な場合、私は非常に「グローバル」としてそれを下に釘よりも、それを注入するSpringようIoCフレームワークを使用することをお勧めしますシングルトンは)。

+0

シングルトンがなぜアンチパターンであると思うのか分かりません。そして、SpringのBeanのデフォルトスコープがシングルトンであることを知っていますか? :P – Rudy

+0

@Rudyなぜそれがアンチパターンであるかを理解するためのリンクを読んでください。それをうまく説明する他のページがいくつかあります:http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx http://www.butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne **しかし**あなたはSingletonパターンとしてSpringからシングルトンスコープを間違えています。それらは、Springのスコープがそのスコープをクラスにハードコードしない点で非常に異なります。 –