0

我有一个类Foo,它有一个doSomething使用两个与类相关的变量的方法,b而且c获取/创建的成本很高。我的第一个版本如下所示:

public class Foo {

    private final A a;

    public Foo(A a) {
        this.a = a;
    }

    public void doSomething() {
        final B b = a.getB();
        final C c = b.getC();

        for (int i = 0; i < 1000; i++) {
            // do something with b and c
        }
    }
}

所以我B通过类变量获得第一个对象(type),通过第一个对象获得a第二个对象(type C)。

现在,由于这些变量与类相关,并且该方法总是只调用一次(尽管不一定在创建 type 的对象时Foo),所以我考虑将它们设为类变量:

public class Foo {

    private final A a;
    private final B b;
    private final C c;

    public Foo(A a) {
        this.a = a;
        b = a.getB();
        c = b.getC();
    }

    public void doSomething() {
        for (int i = 0; i < 1000; i++) {
            // do something with b and c
        }
    }
}

如果这两个中的任何一个,我不确定使用哪个版本。由于可以从现有的类变量中检索它们,因此我对将这两个变量作为类成员感到不舒服a。但是,它将增加 IMO 方法的可读性。

4

4 回答 4

3

你是绝对正确的。如果它增加了可读性,那么一定要这样做。但是,我会问你:在课堂上引用 A 的目的是什么?只是为了获得B和C吗?在这种情况下,我只需在 Foo 的构造函数中输入 B 和 C!

通过这种方式,您甚至可以通过打破对 A 的依赖并使对 B 和 C 的依赖更加明确来使其更具可读性。

另外,请考虑您是否在类的其他方法中使用这些变量。如果答案是肯定的,则表明它们应该是类成员,但是,如果该类包含许多使用这些变量的方法,则可能表明相反。

您应该在这里遵循的一般原则是高内聚原则

于 2012-07-25T19:41:48.160 回答
2

一般来说,如果可以使用局部变量,则最好使用字段。

使用局部变量

  • 将变量限制在使用它的位置。
  • 使用更少的内存。
  • 是线程安全的。
于 2012-07-25T19:39:45.440 回答
0

为什么不在你的类 Foo 中存储 B 和 C 的实例?你在课堂上的某个地方引用 A 吗?否则,将 B 和 C 都存储为实例变量不会降低内存效率,因为存储一个 A 对象包含一个 B 和 C 对象。

于 2012-07-25T19:44:27.630 回答
0

根据我的经验,静态(或类变量|字段|方法)通常会在一段时间后变得邪恶,需要重构,除非这些东西本质上是静态的(Math.PI 或 Math.max() 是示例或此类静态事物)。如果这些方法基于任何动态进行一些计算,我会将它们作为实例。

于 2012-07-25T19:46:15.643 回答