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

通常、アクセサーとミューテーター(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 に答える
1

複数のメソッドに変数を使用している場合は、その変数をグローバル変数として宣言する必要があります。しかし、はい、他のメソッドがその variable を必要とせず、 return ステートメントの束を書きたくない場合は、ローカル変数を使用できます

于 2012-08-13T14:13:50.540 に答える