什么时候在 java 中使用 null?

When to use null in java?

假设我有一个节点类型。

public class Node{
  private Node next;
  private int data;

  // other methods including constructor and setting next reference.
}

或使用 null 作为未初始化的值,如下所示:

public class Node{
  private Node next = null;
  private int data;
}
public class Node{
  private Node next; //initialized to null
  private int data;  //initialized to 0

  // other methods including constructor and setting next reference.
}

这里 nextdata 是实例变量,与局部变量不同,它们被赋予了默认值。因此 next 对象将被分配空值,而作为 int 的 data 将被初始化为 0。

因此您的每个节点实例都将数据初始化为 0,下一个节点设置为空。如果你想要一些特定的初始化,你可以在构造函数中进行或使用相应的 getter/setter 方法。

您的示例之间没有区别,因为 Object 引用的未初始化静态变量和实例变量默认设置为 null

如果您想对 next 可能指向或可能指向另一个 Node 对象的情况建模,您可以使用 Optional (docs here).

例如。您可以初始化 next 指向 Optional.empty():

public class Node {
    private Optional<Node> next = Optional.empty();
    private int data;
}

那么以后插入下一个节点的时候,可以这样:

void setNext(Node node) {
    this.next = Optional.of(node);
}

访问next时需要检查它是否存在。

if (next.isPresent()) {
    Node nextNode = next.get();
    // do something
} else {
    // do something else
}

在这种情况下使用 Optional 的优点是 next 可能指向任何内容这一事实已明确。从而帮助您避免可能的 NullPointerException.