所以我有一个包含以下代码的类:

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

09-11 19:31
查看更多