0

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

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() 的值是三,而不是定义的值。有没有办法解决这个问题,或者我的 A 类和 B 类如何相互关联的架构是不健全的?

我将 B 类中设置的值返回给 A 类的原因是 A 类需要该值进行进一步处理,而 B 类将根据提交的数量进行多个操作和值返回。我没有让B类扩展A类,因为在设计它们的关系时,我觉得它们之间没有任何关系。在这我可能是不正确的。

4

1 回答 1

2

我的理解是,当我实例化 A 类的新实例时,类范围内的所有变量都将设置为其默认值。

不,只有实例变量。你的value变量A是一个静态变量。您从该setFoo方法中使用它的事实是一种设计味道 - 我希望调用一个实例方法setFoo来更改有关我调用它的实例的某些状态。A相反,它正在改变全局状态。

我强烈怀疑您的value变量应该是实例变量而不是静态变量。有关静态成员和实例成员之间差异的更多信息,请参阅Java 教程。

于 2013-09-16T20:16:35.257 回答