enums
を使用せずに、Javaで定数の配列を宣言して初期化するにはどうすればよいですか?
static final Type[] arrayOfConstants = new Type[10]; // not an array of constants
不変の配列を作成したい場合は、できません。 Java内のすべての配列は変更可能です。
クラスで配列を事前定義するだけの場合は、次のようにできます。
private static final int[] MY_ARRAY = {10, 20, 30, 40, 50};
ここでは、長さ5の定義済み配列MY_ARRAY
を作成したので、MY_ARRAY[0]
は10
になります。 MY_ARRAY
フィールドでもfinalが宣言されているため、配列要素を変更できなかったという意味ではありません。したがって、public
またはprotected
修飾子を介してそのような配列を公開しない方が良いでしょう。
値を変更せず、ランダムアクセスを必要とせずにコレクションのメンバーにアクセスしたいだけの場合は、定数配列を使用する代わりに非常に単純な解決策として、最終的な不変リストを作成します。
static final ImmutableList<Type> arrayOfConstants = ImmutableList.of(t1, t2, t3);
つまり、配列コンポーネントは定数であることを意味します。つまり、a [0]は、このpublic static final int SIZE = 10のような定数変数です。
配列のインデックスに名前を付けることはできません。
既存の定数の値を使用して配列を初期化できます。
public static final int SIZE = 10;
public static final int[] CONSTANTS = { SIZE };
配列はfinal
と宣言されていますが、その値は変更される可能性があることに注意してください。 final
は配列変数を再割り当てできないことを保証するだけなので、変異を防ぐために配列をカプセル化する必要があります。
final class Constants {
public static final int SIZE = 10;
private static final int[] CONSTANTS = { SIZE };
public static int getConstant(int index) {
return CONSTANTS[index];
}
}
ループしたい場合は、配列の deep-copy を返すことをお勧めします。
-事前に値がわかっている場合は、配列の値を初期化し、その配列にfinal
のマークを付けます。
-最初に値がわからない場合は、パブリックゲッター/セッターメソッドを記述し、配列をprivate
として宣言します。特定の要素で行われた変更を破棄する(または同じ要素に複数の変更があった場合に例外をスローする)ロジックをセッターメソッドに記述します。
finalがオブジェクトで使用される場合、そのオブジェクトの参照を変更することはできませんが、値の変更は完全に問題ありません。ArrayはJavaのオブジェクトであり、オブジェクトの値を変更したくない場合は、作成したらの場合、オブジェクトを不変にする必要があり、Javaではプリミティブ配列を不変にすることはできません。
final int [] finalArr={5,6,8};
System.out.println("Value at index 0 is "+finalArr[0]);
//output : Value at index 0 is 5
//perfectly fine
finalArr[0]=41;
System.out.println("Changed value at index 0 is "+finalArr[0]);
//Changed value at index 0 is 41
int[] anotherArr={7,9,6};
// finalArr=anotherArr;
//error : cannot assign a value to final variable finalArr
不変配列の詳細については、次のリンクを参照してください。
しばらくの間、この投稿は公開されています。驚きました。
public static final List<LanguageModel> GenderDataSource = new ArrayList<GenderModel>(){{
add(new LanguageModel("0", "English"));
add(new LanguageModel("1", "Hindi"));
add(new LanguageModel("1", "Tamil"));
};};
ここでLanguageModelには、IdとTitleの2つのプロパティが含まれるか、ジェネリックTypeのモデルクラスを使用できます。
一定としてうまく機能するはずです。
-N Baua