我能够通过我的代码传递一个秘密测试,它基本上测试了具有特定输入和预期输出的代码。我一直得到一个断言错误,其中说明了预期的< 1>。但是:< 0>直到我改变了代码:
public Gunner(){
this.gunpower = 1;
this.GunnerStrength = 1;
this.name = "Default Gunner";
}
到
public Gunner() {
this("Default Gunner", 1, 1);
}
为了进一步说明并给出参考点,以下是上述代码之前的代码:
package ship;
public class Gunner {
private String name;
private int gunpower;
private int GunnerStrength;
private int maxGupower;
private int maxGunnerStrength;
private int currentGunpower;
private int currentGunnerStrength;
public Gunner(String l_name, int l_gunpower, int l_GunnerStrength) {
this.name = l_name;
this.currentGunpower = maxGunpower = l_gunpower;
this.currentGunnerstrength = maxGunnerStrength = l_GunnerStrength;
}
public Gunner(Gunner other) {
this.name = new String(other.name);
this.gunpower = new Integer(other.gunpower);
this.GunnerStrength = new Integer(other.GunnerStrength);
this.maxGunpower = new Integer(other.maxGunpower);
this.maxGunnerStrength = new Integer(other.maxGunnerStrength);
this.currentGunpower = new Integer(other.currentGunpower);
this.currentGunnerStrength = new Integer(other.currentGunnerStrength);
}
}
如果有人可以解释上面两个代码之间的差异,我们将不胜感激。
答案 0 :(得分:1)
你原来的Gunner()
构造函数试图复制 Gunner(String,int,int)
构造函数的逻辑,虽然显然(因为你已经通过了“秘密测试”),它由于填写了不同的字段,因此无法正确执行此操作:它已初始化gunpower
,GunnerStrength
和name
;但另一个构造函数初始化name
,currentGunpower
,maxGunpower
,currentGunnerStrength
和maxGunnerStrength
。那是一组完全不同的领域。
您修订后的Gunner()
构造函数重用 Gunner(String,int,int)
构造函数的逻辑,而不是尝试复制它。因此它填补了Gunner(String,int,int)
填写的字段。据推测,测试期望填写这些字段。
一般来说,复制逻辑是一个坏主意,因为不可避免的事情随着时间而变化,所以除非有相反的令人信服的论据,否则重用而不是重复逻辑是要走的路。
重新编辑:
我一直收到一个断言错误,其中说明了预期的< 1>。但是:< 0>
int
字段的默认值为0
,因此,如果您未初始化或为该字段指定其他值,则其值为0
。因此,大概是单元测试检查原始Gunner()
未填写的其中一个字段的值(currentGunpower
,maxGunpower
,currentGunnerStrength
或{{1} })但您的新maxGunnerStrength
填写(通过Gunner()
)。
旁注:
使用这两个默认构造函数之间的区别?
代码中没有默认构造函数。如果您没有为类定义任何构造函数,则编译器将提供default constructor。由于做定义了类的构造函数,因此没有默认的构造函数。
您的Gunner(String,int,int)
构造函数是一个没有形式参数的构造函数,有时称为零参数构造函数或零参数构造函数或 no-arg(s)构造函数(Java使用“参数”而不是“参数”来引用传递给方法和构造函数的东西,但它们通常也被非正式地称为“参数”,因此“args” )。