gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:43 25 4
gpt4 key购买 nike

比较下面两段代码,这两个链表节点的构造函数有什么区别吗?具体考虑以单个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com