Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 选择类变量还是不选择类变量?_Java_Class Variables - Fatal编程技术网

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
              }
          }
      }