对链表使用 private class 的正确方法

Proper way to use private class for a linked list

我正在学习数据结构。在研究链表时,我想知道这是否是一种好的做法。这是我的代码:

class LinkedListStack {
    // <-- Node
    private class Node { // I made a private class!
        private int data;
        private Node next;

        public Node(int data) {
            this.data = data;
        }

        public int getData() {
            return data;
        }
        public void setData(int data) {
            this.data = data;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
    }
    // Node -->
    // <-- Logic

    private Node headNode = null;

    public int top() {
        if(headNode == null) {
            System.out.println("Empty stack");
            return 0;
        }
        else {
            return headNode.getData();
        }
    }
 ...

实际上,我通常在 class LinkedListStack 之外创建节点 class - 但是可以将 class 设为私有 class 节点我发现的问题是在方法 top() 中,我可以访问变量 data下一个直接。有什么方法可以防止访问 class LinkedListStack 中 class 节点的局部变量(数据,下一个)?另外,我想知道 'real' 个私有 class 的例子。人们实际上什么时候在现实世界中使用 private class ?为什么我们需要它?

如果您使用内部 class 实现它,则无法阻止父 class 看到它的私有字段。幸运的是,这样做没有用。内部 class 在这里非常好,例如 java.util.HashMap 的实现使用(至少在 JDK8 中)内部 class 称为 Node 用于表示链表。

实际上,单独的 Node 没有任何意义,这就是为什么最好将其隐藏为私有内部 class。

The problem I have found is that in the method top(), I can access the variable data and next directly.

这不是问题,这是一个功能。 Java 允许您的外部 class 访问其内部 class 的私有方法和字段,即使 class 及其所有字段都是 private.

这样做的理由是嵌套 class 是您自己的 class 实现的一部分,因此两个 class 都可以访问彼此的私有成员。

I usually make the node class outside of the class LinkedListStack

当嵌套的 class 看起来像可以在 class 之外定义的 class 时,这是一个很好的迹象表明 class 应该是静态的,比如这个:

private static class Node {
    ...
}

这是因为非静态嵌套 classes 具有对其外部 class - LinkedListStack 对象的隐式引用 在您的情况下,Node class 不需要。

从外部 class 您可以访问内部 class.Nothing 的私有变量,您可以在那里做很多事情。

私有内部 class 当我们可以从设计的角度确定私有内部 class 不会在封闭 class 之外使用时使用。对于 LinkedList Node 似乎不正确,因为在某些其他代码中你想在 LinkedList 中引用 Node 对象。

正如@Dici 在评论中建议的那样,它可以作为私人使用。仅当您使用 next() 方法 return 节点中的数据而不是节点本身时。您可以在 LinkedList JDK implementation 中看到此私有节点 class。但是,如果您希望在封闭 class 之外操作 Node 对象,则它不应该是私有的。