在Java中,如何声明和初始化一个常量数组,而不使用enums
?
static final Type[] arrayOfConstants = new Type[10]; // not an array of constants
在Java中,如何声明和初始化一个常量数组,而不使用enums
?
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];
}
}
如果您想要循环,我建议返回数组的深拷贝。
如果在对象中使用final,则无法更改该对象的引用,但更改其值是完全可以的。数组是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
如果想了解不可变数组,可以参考以下链接:
-如果你预先知道值,请初始化数组值,并将该数组标记为final
。
-如果一开始不知道值,则编写公共的getter/setter方法,将数组声明为private
。在setter方法中编写逻辑以丢弃对特定元素所做的更改(或在对同一元素进行多次更改时抛出异常)
这篇文章已经开放了一段时间了。 我很惊讶,为什么没有人考虑过。
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,或者使用任何泛型类型的模型类。
作为常量应该很好用。
-- N Baua
我看到了这篇文章,它让我想起了我为一个下棋应用程序所做的事情。
也许你只是想要一组常量,它们都是另一个常量的子级。我的意思是,如果你创建一个名为你的“数组”的最终类,并在其中描述几个常量,那么你就可以通过 MyClass.MYARRAY.MYCONSTANT 访问它。
代码如下:
abstract class Figure {
public static final class WEIGHT{
public static final int PAWN = 1;
public static final int KNIGHT = 3;
public static final int BISHOP = 3;
public static final int ROCK = 5;
public static final int QUEEN = 10;
public static final int KING = 1000;
}
}
public class Pawn extends Figure{
public static final int weight = Figure.WEIGHT.PAWN;
}
我不知道这是否是最好的方法,也不知道它是否是最糟糕的方法。但我认为它回答了你的问题并给出了解决方案。