何时在Java中使用null?

3
假设我有一个节点类型。
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;
}

2
创建实例时,实例变量(也称为字段)已经设置为其“null值”。因此,您已经拥有next = nulldata = 0。无需显式设置它们。 - Seelenvirtuose
在第一种情况下,我会使用一个选项类型。我相当确定J8有它们。 - Carcigenicate
第一个是推荐的。第二个是多余的。 - ControlAltDel
在某些情况下,即使它是默认值,写入初始值也不失为一个好主意。例如,当您想要强调某个布尔值默认为“false”时。但结果并没有任何区别。 - Bubletan
2个回答

4
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是一个对象,将被赋予null值,而data是一个整数,将被初始化为0。
因此,每个节点实例的数据都被初始化为0,并且下一个节点设置为null。如果您想要一些特定的初始化,可以在构造函数中进行,或使用相应的getter/setter方法。

很酷,我不知道那个 :) - CodeYogi

2

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

如果您想模拟next可能指向另一个Node对象的情况,可以使用Optional文档在这里)。

例如。您可以将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

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