1

将属性用作局部变量是一种好习惯吗?在有许多方法使用某些变量的情况下,在每种方法中,变量值都会发生变化。这避免了多次创建新变量和代码增加。有什么建议吗?

private void method1(){
     int totalLength = length1 + 10;
     int totalBreath = (breath1 + breath2) + 20;
     int size =  (totalLength * totalLength);
     System.out.println(size);
}


private void method2(){
     int totalLength = length1 + 20;
     int totalBreath = (breath1 + breath2) + 30;
     int size =  (totalLength * totalLength);
     System.out.println(size);
}


private void method3(){
     int totalLength = length1 + 60;
     int totalBreath = (breath1 + breath2) + 10;
     int size =  (totalLength * totalLength);
     System.out.println(size);
}

如您所见,每个方法中都会重复 totalLength、totalBreath、size。我可以将它们作为类的字段吗?所以,我不需要在每个方法中都声明它。

 private void method1(){
     totalLength = length1 + 10;
     totalBreath = (breath1 + breath2) + 20;
     size =  (totalLength * totalLength);
     System.out.println(size);
}
4

4 回答 4

2

我将您的问题读作“何时应将局部变量提升为类的字段?”

最好的答案是“视情况而定”,但话又说回来,它的准确性很快就因缺乏实用性而黯然失色。

字段应该与类本身有关系,例如字段是类的属性吗?我在下面包含一个示例来说明语法差异,但我同意这篇文章,如果它污染了类的含义,应该避免它。

通常,当您需要在对类的给定实例的不同方法的调用之间维护字段的值时,您只需要一个字段,并且可以选择在应该在所有方法调用之间维护值时使其成为静态类的实例。这将取决于几个因素,如商店约定、性能目标、现有代码库等,因此没有特定代码就没有单一的正确答案。这个问题 似乎包括类似的观点。如果您发现自己使用以下方法,您可能会考虑其他方法,例如将行为重构为帮助类。

另一个问题提出了同样的问题,但从编程学生的角度来看。

例子:

public class VariableScope {
    int field1 = 3;

    void foo()  {
        int a = 2;

        // variable passing in width
        bar1(1);
        bar2(1);

        // variable passing in depth
        bar3(a);

        // uses a field to reduce variable passing
        baz1();
        baz2();

    }

    void bar1(int param)    {
        System.out.println("param=" + param);
    }

    void bar2(int param)    {
        System.out.println("param=" + param);
    }

    void bar3(int param)
    {
        System.out.println("Passing param to bar4");
        bar4(param);
    }

    void bar4(int param){
        System.out.println("param=" + param);
    }

    void baz1() {
        System.out.print("field1=" + field1);
    }

    void baz2() {
        System.out.print("field1=" + field1);
    }
}
于 2012-08-13T14:54:47.843 回答
1

听起来,如果您将变量用于多种方法,则应将该变量声明为全局变量。但是是的,如果没有其他方法需要该变量,并且您不想编写一堆返回语句,则可以使用局部变量

于 2012-08-13T14:13:50.540 回答
1

我想你的意思是一个按属性的字段,它通常有访问器和修改器(get,set-methods)。

通常,您应该使变量的范围尽可能小。如果您使用许多 for 循环,例如:

for ( int i = 0 ; i < 10 ; i++ ) {
}

并将其替换为

int i;

method1() {
  for ( i = 0 ; i < 10 ; i++ ) {
     // some code;
  }
}

method2() {
  for ( i = 0 ; i < 10 ; i++ ) {
     // some code;
  }
}

如果一个线程调用 method1() 而另一个线程调用 method2() 您将面临竞争条件。您可以轻松地在代码中引入难以发现的错误。

于 2012-08-13T14:15:46.417 回答
1

我假设你的意思是这样的:

Class foo() {
  int x;

public bar() {
  for(x = 0; x <100; ++x) ...
}  }

不,这不是一个好习惯。

它甚至可能有害的一个地方是同步/并发/多线程情况:如果您正在使用类成员,他们将需要同步,这会影响性能。否则,您可能会冒多个线程覆盖该字段的值的风险,这可能会导致您的程序出错(可能难以调试)。

于 2012-08-13T14:17:43.140 回答