所以我有一个包含以下代码的类:
class A {
int static value = 0;
public void executeOperationforFooValue(int number) {
B b = new B();
B.executeFooValueChange(number);
}
public void setFoo(int value) {
if (A.value == 0) {
A.value = value;
} else {
A.value = A.value + value;
}
}
}
class B {
A a = new A();
public void executeFooValueChange(int number) {
setFoo(number);
}
public void setFoo(int number) {
a.setFoo(number)
}
}
SetFoo将从外部类中获取值,并在A的当前实例生命周期内对其进行添加/减去。我最初尝试使用此值(并且使其不静态),但是当B.executeFooValueChange()完成执行时并返回到A类,则value的值将重置为0。
我遇到的问题是为类A开发JUnit测试时。我的理解是,当我实例化类A的新实例时,类范围内的所有变量都将设置为其默认值。但是,当我运行以下代码时:
public final void testA() {
A a = new A();
A.executeOperationforFooValue(1);
assertEquals(1,a.setFoo();
}
public final void testB() {
A a = new A();
A.executeOperationforFooValue(2);
assertEquals(2,a.setFoo();
}
第二个测试将失败(顺序无关紧要),因为a.setFoo()的值为3,而不是定义的值。有没有解决这个问题的方法,或者我关于类A和类B如何相互联系的体系结构是不正确的?
我将B类中设置的值返回给A类的原因是,A类需要该值以进行进一步处理,而B类将具有多个操作,并根据提交的数字返回值。我没有B类扩展A类,因为在设计它们之间的关系时,我觉得它们之间没有关系。在这方面我可能是不正确的。
最佳答案
我的理解是,当我实例化A类的新实例时,该类作用域中的所有变量都将设置为其默认值。
否。仅实例变量。您在value
中的A
变量是静态变量。您从setFoo
方法使用它的事实是从设计开始的-我希望一个名为setFoo
的实例方法会更改我在其上调用的A
实例的某些状态。相反,它正在改变全球状态。
我强烈怀疑您的value
变量应该是实例变量而不是静态变量。有关静态成员和实例成员之间的区别的更多信息,请参见Java tutorial。