web-dev-qa-db-ja.com

Javaで静的ローカル変数を作成するにはどうすればよいですか?

私は読んだJavaはC/C++とは異なりstaticローカル変数をサポートしていません。今度は、関数呼び出し間で値を保持するローカル変数を持つ関数をコーディングしたい場合、 それ、どうやったら出来るの?
インスタンス変数を使用する必要がありますか?

51
gameover

クラスのすべてのインスタンスで保持される静的クラス変数を使用できます。それがあなたが望むものなら。そうでない場合は、インスタンス変数を使用します。この変数は、このオブジェクトのメソッド呼び出しでのみ保持されます。

public class Foo {
   static int bar;
   //set bar somewhere

   public int baz() {
      return 3 * bar;
   }
} 
33
Ellie P.

関数呼び出し間で変数値を再利用し、この変数を他のメソッドから分離したい場合、オブジェクトにカプセル化する必要があります。まず、「静的な」変数と必要な関数のみでクラスを定義します。

_class MyFunctionWithState {
    private int myVar = 0;
    public int call() {
      myVar++;
      return myVar;
    }
 }
_

次に、クライアントコードから:

_class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call();
    }
 }
_

funcFooの内部状態に依存している場合、call()を介して関連データを渡すか、Fooのインスタンスを渡して関数を実行できます。適切なゲッターを呼び出します:

_class MyFunctionWithState {
    private int myVar = 0;
    public int call( Foo f ) {
      myVar += f.getBaz();
      return myVar;
    }
 }

class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call( this );
    }
    public int getBaz() {  /*...*/  }
 }
_
6
paradigmatic

ローカル変数はメソッド内の変数です。これらの変数にアクセスできるのはメソッドのみです。静的ローカル変数を持つことはできませんが、インスタンス変数またはクラス変数を使用できます。

デフォルトですべてのオブジェクトにこのメソッドのコピーを作成し、ローカル変数がそれらが存在するメソッドにのみアクセスを制限するため、それ以上分解できない静的なメソッドがある場合。

5
user2626445

インスタンス変数を使用する必要がありますか?

はい-結局のところ、それがインスタンス変数の目的です。オブジェクトのメソッドの呼び出し間の状態を保存します。静的クラス変数を使用すると、同じ結果を得ることができますが、プログラムをより結合し、テスト/モック/保守が難しくなります。

4
Chii

正しくない解答をマークしたか、実際に静的クラス変数が必要でしたが、正しい解答は基本的にLevitの解答、または技術的にはすべての解答の混合です。

私のようなCのバックグラウンドを持つ人々にとって、純粋にグローバルよりもスコープの利点のために静的な関数ローカル変数を本当に望んでいる人にとって、答えはJavaではできないということです。 @paradigmaticのようなことをせずに、静的グローバルと関数を実行しているクラスのインスタンスに一意のgetter()を持つクラスのインスタンスを使用する必要があります。

私が疑うように、あなたがクラスをシングルトンとして実行している場合、または私たち全員が開始した完全に手続き型のプログラマのように完全に静的に実行している場合、@ Ellie Pまたは@ user2626445の答えは問題なく動作します。しかし、あなたが望むと思うことを達成するには、実際にはCのグローバルであるインスタンス変数だけにする必要があります。関数呼び出し間で持続しますが、OOそのため、複数のインスタンスがこの特定の関数に対して独自の永続変数を保持できます。

個人的には、関数宣言のすぐ上のファイルでグローバルを宣言することにより、関数ビット変数を許可しないHi-Tech Cを回避するのと同じ方法で、javeでこれを回避します。そうすれば、後でコードをハックするときに、それがグローバルであると思い込み、それを台無しにしたくなる可能性が低くなります。

0
Alex K

次の例では、countは静的local変数のように動作し、Cで使用できます。

public class Foo {

   private int count = 0;

   public int getCount() {
       return count++;               
   }
} 

他の言語サポートのような静的なlocal変数はありません。 Javaは非常に「クラス」指向であるため、それをそのコンテキストに持ち込もうとします。その動作をシミュレートする場合は、このメソッドでのみ使用されるインスタンス変数を使用します。したがって、これは、クラス自体ではなく、異なるmethod呼び出しに対して静的です。

0
Levit