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