2017-01-06 9 views
1
public class MyClass { 
    public static void main(String args[]) { 
     new MyClass(); 
    } 
    public MyClass() { 
     new MyClass(); 
    } 
} 

上記のコードでは、コンストラクタは同じコンストラクタ内で呼び出されます。同じコンストラクタ内でのコンストラクタの呼び出し

上記のコードの出力は、エラーが発生するまでコンストラクタが呼び出されるため、有名なjava.lang.StackOverflowErrorです。

私の質問は、同じコンストラクタ内でコンストラクタを呼び出すことが有用な実際のシナリオは何ですか?

+1

この目的は何ですか?私は個人的には、あなたがパラメータを取る別のコンストラクタを持っていないかぎり、別のコンストラクタの中でそれらを呼び出すことが意味をなさない限り、それが実際には役に立たないと感じます。 –

+1

論理がそれを望むとき。おそらく、新しく生成されたノートの階層を自動的に作成したいと思っていて、別のオーバーロードされたコンストラクタを呼び出すのですが、 'Node'コンストラクタがあります。 – SomeJavaGuy

答えて

3

私はシナリオを発明できると確信していますが、コンストラクタを再帰的にするのは一般的には便利なことではありません。一般に、コンストラクタが同じクラスのnewを呼び出すと、間違いです。


ここでは、再帰を使用して同じ値のN個のコピーのリストを作成する、人為的な例を示します。

public class MyList { 
     private int value; 
     private MyList next; 

     public MyList(int value, int length) { 
      this.value = value; 
      if (length > 1) { 
       next = new MyList(value, length - 1); 
      } 
     } 
    } 

(そして、はい、このアプローチの欠点がある...)

3

それは再帰ループがある時点で切断された状況で役に立つかもしれない - if文を使用して、例えば:

class LinkedList { 

    Object value; 
    LinkedList next; 

    public LinkedList(final Iterator<?> iterator) { 
     this.value = iterator.next(); 
     if (iterator.hasNext()) { 
      this.next = new LinkedList(iterator); 
     } 
    } 
} 

イテレータで利用可能な要素がある限り、これはコンストラクタを再帰的に呼び出します。

関連する問題