我正在研究数据结构。 在研究链表时,我想知道这是否是好的做法。 这是我的代码:
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 对象,则它不应该是私有的。