1

https://stackoverflow.com/a/572550/1165790

私が設計している関数はめったに呼び出されないため(ただし、呼び出されると再帰チェーンが開始されます)、変数をインスタンスフィールドにしてメモリを浪費したくないため、Javaでこの機能を使用したいクラスがインスタンス化されるたびに。

また、関数への外部呼び出しに実装の詳細を負担させたくないため、追加のパラメーターを作成したくありません。

static キーワードを試してみましたが、Java はそれが不正な修飾子だと言っています。直接的な代替手段はありますか?そうでない場合、どのような回避策が推奨されますか?

クラススコープではなく、関数スコープが必要です。

4

8 に答える 8

12

クラススコープではなく、関数スコープが必要です。

それからあなたは運が悪いです。Java は、static(クラス スコープ)、インスタンス、およびローカル変数を提供します。staticC の関数スコープ変数に相当する Java はありません。


変数が本当に静的である必要がある場合、唯一の選択肢はクラス スコープにすることです。それだけです。

一方、これが再帰的なメソッド呼び出しで使用される作業変数である場合、静的にすることは、アルゴリズムが再入可能ではないことを意味します。たとえば、複数のスレッドで実行しようとすると、すべてのスレッドが同じ static を使用しようとし、互いに干渉するため、バラバラになります。私の意見では、正しい解決策は、メソッド パラメーターを使用してこの状態を渡すことです。(いわゆる「スレッド ローカル」変数を使用することもできますが、いくつかの重大な欠点があります... 200 バイトのストレージのオーダーのオーバーヘッドを心配している場合!)

于 2013-09-28T02:32:23.767 に答える
2

おそらく問題は解決したと思いますが、Java の static についてもう少し詳しく説明します。静的クラス、関数、または変数が存在する可能性があります。

class myLoader{

static int x;
void foo(){
 // do stuff
}

}

class myLoader{


    static void foo(){

    int x;

    // do stuff
    }

    }

最初のケースでは、クラス変数として機能しています。このように「メモリを無駄にする」必要はありません。myLoader.x からアクセスできますが、2 番目のケースでは、メソッド自体が静的であるため、これ自体がクラスに属しています。このメソッド内で非静的メンバーを使用することはできません。シングルトン デザイン パターンでは、クラスを 1 回だけインスタンス化するために static キーワードを使用します。マルチスレッド プログラミングを使用している場合は、静的変数が同時にアクセスされている場合に競合状態を生成しないようにしてください。

于 2013-09-28T02:35:28.490 に答える
1

単に状態を渡すだけで状態を保持できる場合があります。再帰のために内部的にのみ必要な場合は、追加の状態パラメーターを持つプライベート メソッドにデリゲートします。

public void f() { // public API is clean
    fIntern(0); // delegate to private method
}

private void fIntern(int state) {
    ...
    // here, you can preserve state between
    // recursive calls by passing it as argument
    fIntern(state);
    ...
}
于 2013-09-28T02:41:12.200 に答える