7

C++ では、次のコード:

#include <stdio.h>

static const char *init()
{
    printf("in init()\n");
}

static void func()
{
    static const char *str = init();
    printf("in func()\n");
}

int main()
{
    for (int i=0; i<10; ++i) {
        func();
    }
    return 0;
}

func()の多数の呼び出しにもかかわらず、strは、 str の初期化に使用される関数init()でトレース メッセージを出力することによって 1 回だけ初期化されることを示しています実行すると、 init()で 1 回、 func()で 10 回、合計 10 行のトレースがあります。

Java では、次のコードは同じことを行うべきではありませんか?

class test {
    private String init()
    {
        System.out.println("in init()");
        return "FOO";
    }

    private void func()
    {
        final String str = init();
        System.out.println("in func()");
    }

    public test()
    {
        for (int i=0; i<10; ++i) {
            func();
        }
    }

    public static main(String[] args)
    {
        test app = new test();
    }
}

実行すると、 init()func( )にそれぞれ 10 行ずつ、20 行の出力が表示されます。最終変数について読んだことに基づいて、同じように動作すると思いました。だから私はstatic finalを試しましたが、コンパイルされませんでした (またはstaticだけではありません) これを行う方法はありますか? クラス内のいくつかの異なるメソッドから時間のかかる初期化関数を呼び出す必要があるため、変数をクラス スコープに移動するだけではうまくいきません。さらに、ローカル変数は自動的に初期化されないため、 nullのifテストを含めることはできません。変数に値を割り当てる前に変数を囲みます。クラスの各メソッドのクラス スコープで変数を作成できると思いますが、それを管理するのは面倒です。すべてのメソッドに次のようなものを含めると、最良の例えが得られます。

public myfunc1()
{
    final String funcName = java.lang.Thread.currentThread().getStackTrace()[1].getMethodName();
}
public myfunc2()
{
    final String funcName = java.lang.Thread.currentThread().getStackTrace()[1].getMethodName();
}

この場合のfuncNameは各メソッドで一意の値を取得しますが、初期化にはコストがかかります。

4

2 に答える 2

2

修飾子は、 1final回のメソッド呼び出しで変数を定数にします。

インスタンスごとに 1 つの値が必要なため、メソッドの外部でインスタンス メンバー変数を使用できます。

private final String str = init();

private void func()
{
    System.out.println("in func()");
}

すべてのインスタンスのすべてのメソッド呼び出しで単一の値が必要な場合は、メソッドの外部で静的メンバー変数を使用できます。

private static final String str = init();

private void func()
{
    System.out.println("in func()");
}
于 2013-06-07T16:15:04.983 に答える