2017-04-13 7 views
2

私は、fooクラスのインスタンスを作成するdoSomething()メソッドでいくつかのコードをFooクラスに渡しました。そのクラス内のクラスのインスタンスを作成するのが標準的な方法ですか?

public class Foo { 
    public void doSomething() { 
     Foo foo1 = new Foo(); 
    } 
} 

この標準的な方法はありますか?物事については非常に奇妙な方法のようです。なぜこのようなことをしたいのですか?このようにコードを作成する危険性はありますか?あなたが他の練習をする代わりにこれをやりたい理由はありますか?そして最後に、私の直感は、このようなことをしたどのような方法も静的であると宣言しなければならないということです。あれは正しいですか?

+0

私見それはない、と(メソッドが静的でない限り)非常にまれです。 –

答えて

5

はい、これは標準的な方法です。 は共通(インスタンスメソッドではstaticで一般的です)ではありませんが、完全に標準です。

Fooにあるコードはほとんど無関係です:コードは、何らかの理由でthis以外のFooインスタンスを必要とする場合、それはインスタンスを作成し、それを使用するために完全に正常です。

それは本当にすべてのより多くの奇妙な別のクラスの2つのインスタンスを作成する方法に比べてではありません。

おそらく
class Foo { 
    void method() { 
     Bar b1 = new Bar(); 
     Bar b2 = new Bar(); 
     // ... 
    } 
} 

、両方Barのインスタンスを必要とmethod。同様に、doSomethingは、明らかにthis以外のFooを必要とする。

あなたが特に見る1つの場所は、流暢なインターフェイスを備えた不変オブジェクトです。ほとんどのメソッドは、一部のアスペクトを変更してオブジェクトのインスタンスを返します。

public class Thingy { 
    private int a; 
    private int b; 

    public Thingy(a, b) { 
     this.a = a; 
     this.b = b; 
    } 

    public Thingy withA(int newA) { 
     return new Thingy(newA, this.b); 
    } 

    public Thingy withB(int newB) { 
     return new Thingy(this.a, newB); 
    } 

    public int getA() { 
     return this.a; 
    } 

    public int getB() { 
     return this.b; 
    } 

    // ... 
} 

通常withX方法はそれよりももっと面白いですが、あなたはアイデアを得る... 5tingr4yが指摘するようにStringが、この例です:toUpperCasesubstring、...

+0

@JornVernee:LOL - 投稿後に2番目に不変性があると思って追加していましたが、上記を参照してください。 :-) –

+0

またはRecursiveTask :) – HRgiger

+1

これの良い例は文字列です。 trim()とsubString(...)とstuffは新しい文字列を返します。 – 5tingr4y

1

はい、大丈夫です。良い例が成長し、親ノード内の子ノードを作成する(通常)、binary treeです:

class Node { 
    Node left, right; 
    int value; 
    Node (int i) { 
     value = i; 
    } 
    void add(int i) { 
     if (i < value) 
     left = new Node(i); // must create Nodes within Nodes 
     else 
     right = new Node(i); // must create Nodes within Nodes 
} 
+0

すばらしい例。 .. –

関連する問題