1

私は現在、同僚からいくつかのコードをレビューしていて、今まで見たことのない再帰の使用法を見つけました。

私はそれを減らしたので、彼が基本的に行うことは次のとおりです。

public class Main {
    static class Test {
        private static final int MAX = 10;

        private int mValue = 0;

        void test() {
            System.out.println( mValue );
            mValue++;
            if (mValue < MAX) {
                test();
            }
        }
    }

    public static void main( final String[] args ) {
        final Test test = new Test();
        test.test();
    }
}

再帰を使用する場合、必要なすべての変数をパラメーターとして指定し、戻り値で何かを返すか、パラメーターの 1 つを使用して、結果を書き込むことができるコンテナー オブジェクトを提供します。すべての再帰が独自のものになるように作業するデータの範囲。

私は周りを見回しましたが、ネット上のすべての例も私が行う方法で行っています。

それで、これはエラーにつながる可能性がありますか?オブジェクトに矛盾がありますか? これと、メンバー変数を操作するさまざまなプライベート メソッドの呼び出しに違いはありますか?

brgds、

J

4

4 に答える 4

2

Testクラスの単一のインスタンスが同時に実行されない限り、これは期待どおりに機能し.test()ます。

編集

@Itay は、ここでは「同時に」という言葉が間違っていることに気づきました。「互いに協力していない、またはお互いを知らない」という意味で「競合的に」する必要があります。申し訳ありませんが、ドイツ語 (私の母国語) の「コンクレンツ」と英語の「コンカレンシー」は、意味が少し異なります。

/編集

これが保証されている場合、mValueローカル スコープではなくクラス スコープを配置すると、局所性とキャッシュ ヒット率が向上し、パラメータの受け渡しも一部削除されます。全体として、カプセル化に対してパフォーマンスの向上と引き換えになります。

于 2012-12-06T11:28:44.490 に答える
1

ロジックがスレッドセーフ(不変オブジェクトまたは関連するロックを含む) である限り、再帰が発生した場合でも、グローバル クラスのフィールドよりも厳密にパラメーターを優先する理由はありません。

もちろん、関連するフィールドがオブジェクトの状態を表し、単純な醜いヘルパー変数ではない限り...

于 2012-12-06T11:29:53.290 に答える
0

同じインスタンスで再帰メソッドが 2 回呼び出されると問題になる可能性がありますか?

于 2012-12-06T11:26:34.770 に答える
0

それで、これはエラーにつながる可能性がありますか?オブジェクトに矛盾がありますか?

実際には、再帰を実装する方法としてはお勧めできません。

条件(mValue < MAX)は、再帰メソッド内でのみ影響を受ける必要があります。そうでない場合、再帰が予期せず終了する可能性があります。

于 2012-12-06T11:30:54.660 に答える