2017-01-06 4 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); 
     } 
    } 
} 

Это вызовет конструктор рекурсивно, если в итераторе есть элементы.

Смежные вопросы