0

我正在尝试在我的班级上实现 NullObject 设计模式Node

    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 异常。我该如何解决这个问题?

4

3 回答 3

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允许prevNodeNullNode.

接口示例:

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;
    }
} 
于 2013-02-14T11:10:56.200 回答
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);
        }
    } 

要从另一个构造函数调用一个构造函数,请使用 this(args)... 你不能直接调用它

于 2013-03-08T20:27:46.570 回答
0

通常我们不会在 中引用SubclassSuerclass这会以某种方式破坏继承关系。

在您的代码中,还有更糟糕的情况会导致 a StackoverflowException,因为superclass创建了一个对象,而该对象default constructorsubclass调用了默认构造函数,superclass并且它将无限运行,直到您的程序崩溃。

您可以在此处查看Null 对象模式的实现

于 2013-02-14T11:10:06.417 回答