Java 内部类上操作的静态方法
我正在学习算法第四版(Sedgewick),对一些链表练习感到困惑,这些练习似乎要求为非静态节点实现静态方法。比如说, 1.3.27编写一个方法Java 内部类上操作的静态方法,java,static,linked-list,static-methods,inner-classes,Java,Static,Linked List,Static Methods,Inner Classes,我正在学习算法第四版(Sedgewick),对一些链表练习感到困惑,这些练习似乎要求为非静态节点实现静态方法。比如说, 1.3.27编写一个方法max(),该方法引用 链接列表作为参数,并返回中最大键的值 名单。假设所有键都是正整数,如果 列表是空的 或 1.3.31实现嵌套类DoubleNode以构建双链接列表, 其中,每个节点都包含对其前面的项的引用以及 列表中紧跟其后的项(null如果没有此类项)。然后 为以下任务实现静态方法:在 开始,在结尾插入,从开始删除,从 结束,在给定节点之前插入
max()
,该方法引用
链接列表作为参数,并返回中最大键的值
名单。假设所有键都是正整数,如果
列表是空的
或
1.3.31实现嵌套类DoubleNode以构建双链接列表,
其中,每个节点都包含对其前面的项的引用以及
列表中紧跟其后的项(null
如果没有此类项)。然后
为以下任务实现静态方法:在
开始,在结尾插入,从开始删除,从
结束,在给定节点之前插入,在给定节点之后插入,以及
删除给定的节点
据我所知(并由SO的回答和确认),这是不可能的。正如预期的那样,如果我尝试在超类中编写静态方法,Eclipse会出现错误:
public class DoublyLinkedList<Item> {
public static void insertStart(DoubleNode first) {
// implementation
}
private class DoubleNode {
Item item;
DoubleNode next;
DoubleNode previous;
}
}
(给出错误方法insertStart不能声明为静态;静态方法只能声明为静态或顶级类型
)
我可以编写所需的方法作为DoublyLinkedList
类的实例方法,这对我来说是最自然的
然而,我觉得我可能错过了一些重要的事情。作者明确指出这些方法应该是静态的,并且还建议将对第一个节点的引用作为参数(这对于实例方法来说是不必要的,因为类将为第一个节点提供一个实例变量)。我遗漏了什么?您可以将嵌套类设置为
静态
。您将失去具有封闭父类实例的约束,但它将允许您从静态方法对DoubleNode
s进行操作:
// This will compile
public class DoublyLinkedList<Item> {
public static <T> void insertStart(DoublyLinkedList<T> list, DoubleNode<T> first) {
// implementation
}
private static class DoubleNode<E> {
E item;
DoubleNode<E> next;
DoubleNode<E> previous;
}
}
如果您想知道,JDK的LinkedList
实现中也是这样做的:
// Source : Oracle JDK 1.7.0_67 lib - inside LinkedList class
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
//来源:Oracle JDK 1.7.0_67 lib-LinkedList类内部
私有静态类节点{
E项目;
节点下一步;
节点前置;
节点(上一个节点、E元素、下一个节点){
this.item=元素;
this.next=next;
this.prev=prev;
}
}
作为旁注,我同意将这些方法作为实例成员编写更为自然;在OOP库中通常都是这样做的。我没有一本Sedgewick的书,但看起来他试图同时教你嵌套类操作和列表实现;) 多谢各位。看到JDK实现很有趣。在这种情况下,约束的重要性是什么?约束是阻止代码成功编译的因素。它可以确保您不能使用变量来保存“独立的”
DoubleNode
对象,也不能定义返回类型为DoubleNode
的值的静态或外部方法。要点是鼓励封装(“将所有DoubleNode
内容保留在DoublyLinkedList
实例方法中”),但在这种情况下,它违背了“生成静态方法”语句。您可以在此处阅读关于各种嵌套类类型的基本介绍:好的。原始答案中的代码无法编译-这似乎是项
参数化的问题。我在第4行和第9行得到错误无法静态引用非静态类型项
。很抱歉,我刚刚意识到在整个列表类中有一个项
类型参数。我马上就纠正。
public static void insertStart(DoublyLinkedList<?> list, DoubleNode<?> first) {
...
}
// Source : Oracle JDK 1.7.0_67 lib - inside LinkedList class
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}