5

C では、関数内に静的変数を作成できます。その変数のスペースは、関数変数と一緒に割り当てられるのではなく、プログラムの起動時に割り当てられます。(私の C 言語をあまり厳しく嘲笑しないでください。私は Java で長い間プログラミングを行ってきました :)

void myFunc(){
  static SomeStruct someStruct;
  someStruct.state=INITIALIZED;
  goDoSomethingInteresting(MY_COMMAND,&someStruct);
}

Java で同様のことをしたい場合は、クラス変数を作成してから使用します。

Class TheClass {
   SomeStruct someStruct = new SomeStruct();
   void myFunc(){
     someStruct.setState(INITIALIZED);
     goDoSomethingInteresting(MY_COMMAND,someStruct);
   }
}

私の質問は、このようなことをするためのベストプラクティスは何ですか? someStruct変数を関数myFuncに関連付けたいのですmyFuncが、 は について知っているか使用する必要がある唯一のコードですが、コードsomeStruct内で変数を関数の近くに配置する以外にその関連付けを行う方法はありません。上に置くと、関数の Javadoc がおかしくなり、下に置くと、それらが一緒に属していることはあまり明確ではありません。

通常はsomeStructローカルで作成するだけですが、私の場合は作成に非常にコストがかかり、タイトなループでsomeStruct呼び出します。myFunc

4

5 に答える 5

5

小さなクラスはクリーンsomeStructな動作に関連付けられますmyFuncが、物事を理解して維持するための余分なオーバーヘッドになります。価値があるかもしれませんが、そうでないかもしれません。

class TheClass {
   MyFuncBehavior myFuncer = new MyFuncBehavior();
   void myFunc() {
      myFuncer.myFunc();
   }
}

class MyFuncBehavior {
   private static SomeStruct someStruct = new SomeStruct();

   public void myFunc() {
     someStruct.setState(INITIALIZED);
     goDoSomethingInteresting(MY_COMMAND,someStruct);
   }
}
于 2012-04-17T20:36:20.963 に答える
2

Java クラスを作成しているので、それをクラスのプライベート メンバーにするだけです。同じファイルで作業している可能性のある他の人がファイル内の他の場所でそのファイルを使用するのを防ぎたい場合は、その横にコメントを入れてください。

于 2012-04-17T20:29:21.317 に答える
2

function static variable

  • プログラムの寿命がある
  • 関数のスコープを持つ

つまり、初期化されると、最後に割り当てられた値を使用して関数を呼び出すたびに使用できますが、関数の外部ではアクセスできません。

これは、関数を 1 つのメソッドを持つクラスに変換し、静的変数をそのクラスのメンバーにする場合にうまく適合します。

例えば

void F()
{
   static int i;
}

なる

class F
{
    int i;
    func() ....
}
于 2012-04-17T20:46:50.060 に答える
0

Java で同様のことをしたい場合は、クラス変数を作成してから使用します。

はい、それがベストプラクティスです。

于 2012-04-17T20:27:50.653 に答える
0

単一のソース ファイル (つまり、クラスとそのすべての内部クラス) 内でカプセル化を強制しようとしてもあまり意味がないと思います。Java はこの原則に従っているようです。

ソース コードにアクセスできる人は誰でも、任意のフィールドにアクセスできるように変更できます。

ただし、コードを再設計することはオプションです。

  1. myFunc()使用するフィールドとともに別のクラスに 抽出できます。
  2. メソッドの署名を変更しvoid myFunc( SomeStruct struct)て、パラメーターとして渡すだけです。呼び出し元のローカル変数として保存します。

ループが実際に非常に狭い場合、オーバーヘッドは最小限に抑えられます。(個人的には、上記のいずれも行いません。)

于 2012-04-17T20:25:48.127 に答える