我有一个类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
得到第一个对象(类型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方法的可读性。
答案 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()是例子或者这样的静态东西)。如果这些方法基于任何动态进行一些计算,我会将它们保留为实例。