对链表使用私有类的正确方法



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

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();
        }
    }
 ...

实际上,我通常在类 LinkedListStack 之外制作节点类 - 但是可以制作私有类 Node 吗? 我发现的问题是,在方法top()中,我可以直接访问变量数据和next。 有没有办法阻止访问类 LinkedListStack 中类节点的局部变量(数据,下一个)? 另外,我想知道私人课程的"真实"示例。 人们在现实世界中什么时候真正使用私人课程? 我们为什么需要它?

我发现的问题是,在方法top()中,我可以直接访问变量数据和下一步。

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

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

我通常使节点类在类之外LinkedListStack

当嵌套类看起来像可以在类外部定义的类时,这很好地表明该类应设置为静态的,如下所示:

private static class Node {
    ...
}

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

如果使用内部类实现它,则无法阻止父类查看其私有字段。幸运的是,这样做是没有用的。内部类在这里是完全可以的,例如,请参阅使用(至少在JDK8中)Node的内部类来表示链表的java.util.HashMap的实现。

实际上,仅凭Node是没有意义的,这就是为什么最好将其隐藏为私人内部类。

从外部类中,您可以访问内部类的私有变量。你在那里无能为力。

当我们从设计角度确定私有内部类不会在封闭类之外使用时,将使用私有内部类。对于 LinkedList 节点作为私有节点似乎不正确,因为在其他一些代码中,您希望在 LinkedList 中引用 Node 对象。

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

相关内容

  • 没有找到相关文章

最新更新