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