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



比较以下两部分代码,对于链表中的节点,这两个构造函数之间有什么区别吗?具体考虑使用单个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;
}

这些都违反了Don't Repeat Yourself (DRY)原则

相关内容

  • 没有找到相关文章

最新更新