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