要类变量还是不要类变量?

时间:2012-07-25 19:35:41

标签: java class-variables

我有一个类Foo,其方法doSomething使用两个与类相关的变量bc,这些变量的获取/创建成本很高。我的第一个版本看起来像这样:

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得到第一个对象(类型a),通过第一个对象得到第二个对象(类型C)。

现在,由于这些变量与类有关,并且方法始终只调用一次(虽然不一定在创建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 个答案:

答案 0 :(得分:3)

你是对的。如果它增加了可读性,那么所有方法都可以。但是,我会问你:在课堂上引用A的目的是什么?只是为了获得B和C? 在这种情况下,我只需在Foo的构造函数中输入B和C!

这样你甚至可以通过打破对A 的依赖来使其更具可读性。使对B和C的依赖更加明确。

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

您应遵循的一般原则是High Cohesion

的原则

答案 1 :(得分:2)

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

使用本地变量

  • 将变量限制在使用位置。
  • 使用更少的内存。
  • 是线程安全的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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