0

次のクラスの例を見てください。

public class GlobalExample{
    static int width;
    static int height;
    static int size;
}

クラスメンバーは、次を使用して別のクラスからアクセス/初期化できます。

GlobalExample.width = 1

ただし、変数を最終的なものにしたい場合(プログラムが変数に頻繁にアクセスしているときに効率が上がると理解しているため)、外部で初期化することはできなくなりますが、クラス内で初期化することもできないようですコンストラクタの外。ただし、GlobalExample 自体は初期化されないため、コンストラクターは実行されません。

私の質問は、クラス内で最終変数を初期化する方法があるかどうかです。

あるいは、効率的に間違ったツリーを鳴らしているだけですか? VariablePackage クラスのインスタンスを作成し、それを 100 万回の関数呼び出しに渡す方が効率的でしょうか?

ありがとう

4

4 に答える 4

3

それらを宣言するときにそれらを初期化できませんか?

public class GlobalExample{
    final static int width = 1;
    final static int height = 5;
    final static int size = 100;
}

それらを動的に変更する必要がある場合は、おそらくfinalここでは適していません。

于 2013-02-05T19:51:49.517 に答える
0

static final変数をインラインで初期化することに加えて、静的初期化ブロックを使用することもできます。

public class MyClass {
    public static final String myFinal;
    static {
        myFinal = "Hello world";
    }
}

ブロック内で、static必要な値を取得するために必要なコードを記述できます。

間違ったツリーの効率について吠えていますか? おそらく。最初は簡単に書いてください。次に、これが実際にアプリケーションのパフォーマンスのボトルネックであることを確認したら、いくつかの異なる方法でコーディングを試み、影響を測定します。

また、設計の観点から、静的なものは扱いにくい傾向があるため、システムでこれらのフィールドを静的にする必要があるかどうかを自問してください。

于 2013-02-05T20:23:51.070 に答える
0

boolean設定されているかどうかを示す for each 変数を追加し、変数をプライベートにbooleanしてから、パブリック セッターでチェックします。

public class GlobalExample{
    private static int width;
    private static int height;
    private static int size;
    private static boolean widthSet;
    private static boolean heightSet;
    private static boolean sizeSet;

    public static void setWidth(int width) {
        if (widthSet) {
            widthSet = true;
            GlobalExample.width = width;
        } else {
            // Throw exception maybe?
        }
    }

    public static int getWidth() {
        if (widthSet) {
            return width;
        } else {
            // Throw an exception
        }
    }

    // Etc.
}

または、ラッパー クラス ( 、 など) を使用IntegerCharacterて、値が の場合にのみ設定することもできますnull。これは、 が変数自体の値に統合されるbooleanことを除いて、アプローチに似ています (つまり、 の場合は設定されません)。booleannull

于 2013-02-05T20:02:17.210 に答える
0

より複雑な初期化ロジックを実行するには:

public class GlobalExample {
    private static final int height;
    private static final int width;

    static {
        switch(getBrowserType()) {
            case 0: height = 100; width = 50; break;
            case 1: height = 400; width = 600; break;
            default: height = 798; width = 1024; break;
        }
    }
}
于 2013-02-05T20:26:02.057 に答える