java - 链表中节点的这两个构造函数之间有什么区别吗?

标签 java linked-list

比较下面两段代码,这两个链表节点的构造函数有什么区别吗?具体考虑以单个 E 对象作为参数的构造函数。

A.

public class Listnode<E> {
  //*** fields ***
    private E data;
    private Listnode<E> next;

  //*** constructors ***
    // 2 constructors
    public Listnode(E d) {
        this(d, null);
    }

    public Listnode(E d, Listnode n) {
        data = d;
        next = n;
    }
}

B.

public class Listnode<E> {
  //*** fields ***
    private E data;
    private Listnode<E> next;

  //*** constructors ***
    // 2 constructors
    public Listnode(E d) {
        data = d;
        next = null;
    }

    public Listnode(E d, Listnode n) {
        data = d;
        next = n;
    }
}

我刚开始借助互联网自学 Java,我认为 B 中的实现更容易阅读,但是 A 来自可靠的消息来源。从表面上看,它们似乎都工作正常。两者之间有什么优势吗?

最佳答案

最终结果是两个构造函数的赋值相同,但是,选项 A 更好,因为您不会重复代码。

选项 B 更容易出错,因为您在两个构造函数中都分配了字段。

如果您在其中一个构造函数中弄乱了分配或忘记分配其中一个字段,这可能会导致潜在的错误。此外,如果您以后向类中添加更多字段,您将必须记住在多个地方为它们赋值。

此外,如果您必须进行输入验证,则必须在多个构造函数中复制它(或者至少在多个构造函数中调用验证方法),最好将所有验证放在一个地方。

例如,假设您需要确保数据不是null:

//validate that data can't be null
public Listnode(E d) {
    if(d ==null){
       throw new NullPointerException("data can't be null");
    }
    data = d;
    next = null;
}

public Listnode(E d, Listnode n) {
    if(d ==null){
       throw new NullPointerException("data can't be null");
    }
    data = d;
    next = n;
}

这一切都违反了不要重复自己的原则(DRY)

关于java - 链表中节点的这两个构造函数之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31331125/

相关文章:

java - 如何让 schemaspy 看到 mysql 连接器?

c - 无法从函数返回字符串

c - 将数据插入二叉搜索树中的链表

Java 一个语句中有两个等号?

c - 链表中的字符串被覆盖

java - 如何一次向 Telnet OutputStream 写入一个字符?

java - JNDI 解决了 ApplicationContext 在 Spring 中没有解决的问题?

java - 如何在 Java 中将索引图像转换为 RGB 图像?

java - 为什么Java时间戳解析在毫秒部分前缀0?

c - 链接列表中的元素没有被删除