2009-09-15 12 views
5

クラスはそれ自身のオブジェクトを返すことができます。クラスはそれ自身のオブジェクトを返すことができます

私の例では、システムへの変更を表す "Change"というクラスがありますが、それはどういうわけか型のオブジェクトを返す設計原則や、すべてが移入されたArrayList最近のChangeオブジェクト

答えて

3

はいできます。実際、シングルトンクラスとまったく同じです。最初にクラスレベルのgetInstance()メソッドを呼び出すと、それ自体のインスタンスを構築し、それを返します。次に、getInstance()を呼び出して、すでに構築されたインスタンスを返します。

特定のケースでも同様の方法を使用できますが、最近の変更のリストを決める方法が必要です。そのような変更の独自のリストを維持する必要があります。これは、静的な配列や変更のリストで行うことができます。リストの基礎となる情報が消えないことを確かめてください。たとえば、オブジェクトへのポインタを保持していて、それらのオブジェクトがクライアントによって解放されていれば、C++(たとえば)で発生する可能性があります。

Javaのような自動ガベージコレクション環境では、オブジェクトがまだ参照されていても消えないため、問題が少なくなっています。

ただし、にはがありません。私の好みは2つのクローズ、チェンジリストと変更を持つことです。変更クラスのインスタンスを作成するときは、変更リストオブジェクト(変更リストに関連付ける必要がない場合はnull)をコンストラクタに渡し、変更をそのリストに追加してから戻します。

また、変更自体を作成し、それを返すチェンジリストメソッドを持たせて、独自の目的で変更を記憶してください。

次に、チェンジリストを照会して、最近の変更を取得することができます(ただし、最近の定義はあります)。それは複数のリストを許可するのでより柔軟になります。

あなたは外に出て、変更を複数のチェンジリストに関連付けることもできます。

+1

私はグーグルシングルトン、シングルトンはシステムの状態を維持する単一のオブジェクトだと思われます。私の場合、最近の変更を表すこれらの「変更」オブジェクトは、いつでも多く存在します。そのようなパターンの名前はありますか? – Ankur

+0

私はそれをどのように設計するのか、私のアップデートを見てください(別のチェンジリストとクラスを変更してください)。あなたが持っている方法は、あらゆる変化を知っているすべての変化を持っています。それは、カプセル化の境界を私の好みのために少し伸ばしているようです。是非、あなたが快適ならそれをしてください、しかし私はそうしません。 – paxdiablo

+0

はい私はChangeListクラスのアイデアが気に入っています。ありがとう – Ankur

0

悪いと言うデザインルールはわかりません。あなたのモデルで、単一の変更が複数の変更で構成されている場合は、その変更を行います。

3

クラスは、しばしば「ファクトリ」メソッドと呼ばれることから、自分自身のインスタンスを返すことがあります。 JavaやC++(など)では、これは通常静的静的メソッドです。クラスのインスタンスではなくクラスで直接呼び出すことになります。あなたのケースでは

、Javaで、それは次のようになります。

List<Change> changes = Change.getRecentChanges(); 

を。これは、変更クラス自体は、いくつかの他のオブジェクトの責任であること、そのジョブのではなく、変化自体を追跡する方法を知っていることを前提としていシステム内で

クラスはまた、クラスのインスタンスが1つだけの世界に存在することを確認したいシングルトンパターンで自身のインスタンスを返すことができます。

Foo foo = Foo.getInstance(); 
+0

クラス自体ではなくクラスのインスタンスから呼び出すと問題がありますか – Ankur

+0

それ自体は問題はありませんが、変更が1つの変更をモデル化するために使用されている場合(何でも)をシステムに追加すると、その変更が他の多くの変更についても知っていることは驚くようです。だからこそ、あなたは通常Changeに対して静的な方法をとっているのですが、単一のChangeが知っているよりもより多くのグローバルなスマートを持つことが理にかなっています。 –

+0

これは驚いたことに、「工場」という言葉の唯一の回答です – annakata

1

流れるようなインターフェイスのメソッドは、プリンシパルに取り組みますそれ自身のインスタンスを返す、例えば

StringBuilder sb = new StringBuilder("123"); 
sb.Append("456").Append("789"); 
2

はい、クラスには、それ自身のインスタンスを返すメソッドを含めることができます。これは非常に一般的なシナリオです。

C#では、一例は次のようになります。

public class Change 
{ 
    public int ChangeID { get; set; } 

    private Change(int changeId) 
    { 
     ChangeID = changeId; 
     LoadFromDatabase(); 
    } 

    private void LoadFromDatabase() 
    { 
     // TODO Perform Database load here. 
    } 

    public static Change GetChange(int changeId) 
    { 
     return new Change(changeId); 
    } 
} 
1

はあなたがモデル化しようとしているかについて考える必要があります。あなたのケースでは、私は1つまたは複数のChangeオブジェクトを含むChangeListクラスを持っています。

一方、クラスがクラスの他のインスタンスを参照できる階層構造をモデル化していたら、やっていることは意味があります。例えば。他のツリーノードを含むことができるツリーノード。

もう1つの一般的なシナリオは、クラスにインスタンスを返す静的メソッドを実装させることです。これは、クラスの新しいインスタンスを作成するときに使用する必要があります。あなたは、関数チェーンを行うことができるようにthisを返すために

5

もう一つの理由は、次のとおりです。

class foo 
{ 
    private int x; 
    public foo() 
    { 
     this.x = 0; 
    } 

    public foo Add(int a) 
    { 
     this.x += a; 
     return this; 
    } 

    public foo Subtract(int a) 
    { 
     this.x -= a; 
     return this; 
    } 

    public int Value 
    { 
     get { return this.x; } 
    } 

    public static void Main() 
    { 
     foo f = new foo(); 
     f.Add(10).Add(20).Subtract(1); 
     System.Console.WriteLine(f.Value); 
    } 
} 
 
$ ./foo.exe 
29 

あり、時間との関数チェーンを行うための場所だし、それはありません「いつでも、どこでも。」しかし、LINQは、という非常に良い場所の良い例です。は、機能連鎖の恩恵を受けています。