2013-02-14 2 views
0

я пытаюсь реализовать шаблон проектирования NullObject на моем классе Node:OOP Инициализация переменных экземпляра с экземплярами класса детской

class Node{ 
     Node nextNode; 
     char key; 
     Node prevNode; 

     /* 
      Would like to initialize nextNode and prevNode to instance of 
      NullNode, something like this (I know what I am doing is wrong) 
     */ 
     Node() { 
      nextNode = new NullNode(); 
      prevNode = new NullNode(); 
     } 
    } 

    class NullNode extends Node { 
     .... 
    } 

С помощью этого кода я получаю исключение StackOverflowError. Как я могу решить эту проблему?

+1

Есть вы слышали о «супер'-ключевом? Вы можете вызвать супер-конструктор 'super()'. – jlordo

+1

То, что вы делаете, не выглядит неправильным для меня, вам просто нужно переопределить конструктор в 'NullNode', чтобы избежать бесконечной рекурсии. –

+0

Прямо сейчас я получаю StackOverflowError Exception – Sush

ответ

0

Обычно мы не ссылаемся на Subclass в Suerclass, это как-то нарушает отношение наследования.

В вашем коде есть что-то еще хуже, что приведет к StackoverflowException потому что superclass создает объект с default constructor из subclass, который в свою очередь вызывает конструктор по умолчанию superclass, и он будет идти бесконечно, пока ваша программа аварии.

Вы можете увидеть реализацию паттерна Null Objecthere

1

Вы получаете StackOverflow, поскольку родительский конструктор всегда вызывается (см также: https://stackoverflow.com/a/527069/664108). В вашем случае это приводит к бесконечной рекурсии.

Чтобы избежать этого, вам придется добавить проверку в Node конструктора и вызовите его явно из NullNode конструктора:

public class Node 
{ 
    Node nextNode; 
    char key; 
    Node prevNode; 

    Node() { 
     Node(true); 
    } 
    Node(boolean createNullNodes) { 
     if (createNullNodes) { 
      nextNode = new NullNode(); 
      prevNode = new NullNode(); 
     } 
    } 
} 

public class NullNode extends Node 
{ 
    NullNode() { 
     super(false); 
    } 
} 

Лучшее решение для шаблона NullObject использует интерфейсы. Это устраняет проблему конструктора, а также позволяет удалить ненужные переменные nextNode и prevNode из NullNode.

Пример с интерфейсом:

public interface INode 
{ 
    public char getKey(); 
    public INode getNext(); 
    public INode getPrev(); 
    // ... 
} 

public class Node implements INode 
{ 
    Node nextNode; 
    char key; 
    Node prevNode; 

    Node() { 
     nextNode = new NullNode(); 
     prevNode = new NullNode(); 
    } 
    public char getKey() { 
     return key; 
    } 
    public INode getNext() { 
     return nextNode; 
    } 
    public INode getPrev() { 
     return prevNode; 
    } 
} 

public class NullNode implements INode 
{ 
    public char getKey() { 
     return null; 
    } 
    public INode getNext() { 
     return this; 
    } 
    public INode getPrev() { 
     return this; 
    } 
} 
+0

По-прежнему получается stackoverflow..even после того, как пустой конструктор в nullnode. – Sush

+0

Извините, у меня было неправильное представление. Обновлен ответ с альтернативным решением. –

+0

Я попробовал ваше вышеупомянутое решение Node() {Node (true); } и Node (boolean createNullNodes) {...}, но получают ошибку в Node() {Node (true); } как «Метод Node (логический) не определен для типа Node" – Sush

0

Попробуйте

public clas Node 
    { 
     Node nextNode; 
    char key; 
    Node prevNode; 

    Node() { 
     this(true); 
    } 
    Node(boolean createNullNodes) { 
     if (createNullNodes) { 
      nextNode = new NullNode(); 
      prevNode = new NullNode(); 
     } 

    } 
} 

    public class NullNode extends Node 
    { 
     NullNode() { 
      super(false); 
     } 
    } 

Чтобы вызвать один конструктор из другого использования конструктора это (арг) ... вы не можете назвать это непосредственно

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