繁体   English   中英

内部类操作的静态方法

[英]Static methods for operations on inner class

我正在通过算法第四版 (Sedgewick),并且对一些似乎要求为非静态节点实现静态方法的链表练习感到困惑。 例如,

1.3.27编写一个方法max() ,该方法将链接列表中的第一个节点作为参数引用,并返回列表中最大键的值。 假设所有键都是正整数,如果列表为空则返回0

要么

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;

    }
}

(给出错误Cannot make a static reference to the non-static type DoubleNode ); 或者在内部阶级:

public class DoublyLinkedList<Item> {

    private class DoubleNode {
        Item item;
        DoubleNode next;
        DoubleNode previous;

        public static void insertStart(DoubleNode first) {
            // implementation
        }
    }
}

(给出错误The method insertStart cannot be declared static; static methods can only be declared in a static or top level type )。

我可以将所需的方法编写为DoublyLinkedList类的实例方法 ,这对我来说似乎是最自然的。

但是,我觉得我可能会错过这里重要的事情。 作者明确指出方法应该是静态的,并且还建议将第一个节点作为参数引用(这对于实例方法是不必要的,因为该类将具有第一个节点的实例变量)。 我错过了什么?

您可以将嵌套类设置为static 您将失去具有封闭父类实例的约束,但它将允许您从静态方法操作DoubleNode

// 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;

    }
}

这里要注意两件事:正如您所看到的,当使内部类静态时,您需要为其提供自己的类型参数(在本例中为E )。 在您的代码中,您不需要这样做,因为任何DoubleNode实例都保证包含DoublyLinkedList实例,该实例已经确定了Item将是什么。

其次,您需要为静态方法(“ <T> ”)引入一个类型参数,因此您可以为两个参数强制执行相同的泛型类型。 你也可以这样做并侥幸逃脱:

public static void insertStart(DoublyLinkedList<?> list, DoubleNode<?> first) {
    ...
}

如果您想知道,这也是在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;
    }
}

作为旁注,我同意将这些方法作为实例成员编写更为自然; 这就是在OOP库中通常完成的。 我没有Sedgewick的书的副本,但看起来他正试图同时教你嵌套类操作和列表实现;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM