为什么链表中的节点类被定义为静态而不是普通类

7
在java.util.LinkedList包中,Node类被定义为一个静态类,这是必要的吗?目的是什么?
我们可以从这个页面找到源代码。

它是静态的,因为一个List<E>Node<E>可以与每个其他List<E>的节点具有相同的类型。该类型不需要绑定到单个List<E>实例。 - Patrick Parker
@PatrickParker 谢谢,很有帮助。 - Ivan
1个回答

8

静态嵌套类的实例没有引用嵌套类的实例。这就跟把它们放在一个单独的文件中差不多,但如果与嵌套类的内聚性很高,则将其作为嵌套类是一个好选择。

然而,非静态嵌套类需要创建嵌套类的实例,并且实例绑定到该实例并具有对其字段的访问权限。

例如,看看这个类:

public class Main{

  private String aField = "test";

  public static void main(String... args) {

    StaticExample x1 = new StaticExample();
    System.out.println(x1.getField());


    //does not compile:
    // NonStaticExample x2 = new NonStaticExample();

    Main m1 = new Main();
    NonStaticExample x2 = m1.new NonStaticExample();
    System.out.println(x2.getField());

  }


  private static class StaticExample {

    String getField(){
        //does not compile
        return aField;
    }
  }

  private class NonStaticExample {
    String getField(){
        return aField;
    }
  }

静态类StaticExample可以直接实例化,但无法访问嵌套类Main的实例字段。 非静态类NonStaticExample需要Main的实例才能实例化,并且可以访问实例字段aField
回到你的LinkedList示例,这基本上是一种设计选择。 Node的实例不需要访问LinkedList的字段,但将它们放在单独的文件中也没有意义,因为Node是LinkedList实现的一个实现细节,在该类之外没有用处。因此,将其设置为静态嵌套类是最明智的设计选择。

感谢提供示例,确实让理解变得容易了。Node<E>类型不需要绑定到单个List<E>实例。 - Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接