将私有类用于链表的正确方法

时间:2015-01-03 05:52:46

标签: java data-structures linked-list private

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

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()中,我可以直接访问变量 data next 。有没有办法阻止在LinkedListStack类中访问类Node的局部变量(data,next)?此外,我想知道一个私人班级的“真实”例子。实际上人们什么时候在现实世界中使用私人课程?为什么我们需要它?

3 个答案:

答案 0 :(得分:4)

  

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

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

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

  

我通常在类LinkedListStack

之外创建节点类

当一个嵌套类看起来像一个可以在类外定义的类时,这是一个很好的指示,该类应该是静态的,如下所示:

private static class Node {
    ...
}

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

答案 1 :(得分:2)

如果使用内部类实现它,则无法阻止父类查看它的私有字段。幸运的是,这样做是没有用的。这里的内部类很完美,例如参见java.util.HashMap的实现,它使用(至少在JDK8中)一个名为Node的内部类,用于表示链接列表。

实际上,仅Node没有任何意义,这就是为什么将它隐藏为私人内部类更好的做法。

答案 2 :(得分:1)

从外层你可以访问内部类的私有变量。你可以在那里做很多事情。

当从设计角度确定私有内部类不会在封闭类之外使用时,使用私有内部类。对于LinkedList节点看起来并不正确,因为在其他一些代码中你想引用LinkedList中的Node Object。

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