Java 选择类变量还是不选择类变量?
我得到了一个类Java 选择类变量还是不选择类变量?,java,class-variables,Java,Class Variables,我得到了一个类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
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
}
}
}
如果这两个版本中有任何一个,我不确定该使用哪个版本。我不知何故不愿意让这两个变量成为类成员,因为它们可以从现有的类变量
a
中检索。但是,它会增加方法的可读性。一般来说,如果可以使用局部变量,则最好使用字段
使用局部变量
- 将变量限制到使用它的位置
- 使用更少的内存
- 是线程安全的
- 将变量限制到使用它的位置
- 使用更少的内存
- 是线程安全的
- 你完全正确。如果它增加了可读性,那么你就必须这么做。但是,我想问你:从类中引用A的目的是什么?只是为了得到B和C吗?
在这种情况下,我只需在Foo的构造函数中输入B和C
通过这种方式,您甚至可以通过打破对A的依赖并使对B和C的依赖更加明确,从而使其更具可读性
也可以考虑在类中的其他方法中是否使用这些变量。如果答案是肯定的,则表示它们应该是类成员,但是,如果类包含许多不使用这些变量的方法,则可能表示相反
你在这里应该遵循的一般原则是你是绝对正确的。如果它增加了可读性,那么你就必须这么做。但是,我想问你:从类中引用A的目的是什么?只是为了得到B和C吗? 在这种情况下,我只需在Foo的构造函数中输入B和C 通过这种方式,您甚至可以通过打破对A的依赖并使对B和C的依赖更加明确,从而使其更具可读性
也可以考虑在类中的其他方法中是否使用这些变量。如果答案是肯定的,则表示它们应该是类成员,但是,如果类包含许多不使用这些变量的方法,则可能表示相反
这里您应该遵循的一般原则是为什么不在类Foo中只存储B和C的实例呢?你在班上的某个地方提到过A吗?否则,将B和C都存储为实例变量并不会降低内存效率,因为存储一个A对象包含一个B和C对象。为什么不在类Foo中只存储B和C的实例呢?你在班上的某个地方提到过A吗?否则,将B和C都存储为实例变量并不会降低内存效率,因为存储一个A对象包含一个B和C对象。根据我的经验,静态(或类变量| field |方法)通常会在一段时间后变得邪恶,需要重构,除非这些东西本质上是静态的(Math.PI或Math.max()是示例或类似静态的东西)。根据我的经验,静态(或类变量| field | method)通常在一段时间后变得邪恶,需要重构,除非这些东西本质上是静态的(Math.PI或Math.max()是示例或类似静态的东西)。如果这些方法是基于任何动态的计算,我会把它们作为实例。我把代码片段做得太简单了→ 不幸的是,我无法摆脱类变量
a
,但实际上类中只有这个方法,所以基本上所有方法都使用这些变量:在这种情况下,我会问自己,为什么这段代码首先被隔离到一个单独的类中?它可能只是类中实际使用此逻辑的方法吗?有两个原因说明它不是另一个类中的方法:1。再加上类似的方法,它会使这个类变得杂乱无章(读:doSomething
对于它自己的类来说已经足够大了)。它是从抽象层调用的,所以我实际上想隐藏实现。从两个投票结果中,我得出结论:使用局部变量作为类成员,但前提是它们与类密切相关,并且显著提高可读性。那么又是一个没有实际答案的问题吗?:-)@问:为什么这是你务实的答案:-)这是一个关于灰色和模糊区域的问题,这些区域没有黑色或白色的答案,只是拇指法则和指南,不同的人会有不同的解释。我把这个片段做得太简单了→ 不幸的是,我无法摆脱类变量a
,但实际上类中只有这个方法,所以基本上所有方法都使用这些变量:在这种情况下,我会问自己,为什么这段代码首先被隔离到一个单独的类中?它可能只是类中实际使用此逻辑的方法吗?有两个原因说明它不是另一个类中的方法:1。再加上类似的方法,它会使这个类变得杂乱无章(读:doSomething
对于它自己的类来说已经足够大了)。它是从抽象层调用的,所以我实际上想隐藏实现。从两个投票结果中,我得出结论:使用局部变量作为类成员,但前提是它们与类密切相关,并且显著提高可读性。那么又是一个没有实际答案的问题吗?:-)@这是一个关于灰色和模糊区域的问题,没有黑色或白色的答案,只是经验法则
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
}
}
}