Java常量数组

11

在Java中,如何声明和初始化一个常量数组,而不使用enums

static final Type[] arrayOfConstants = new Type[10]; // not an array of constants

5
您的意思是确保数组的值无法更改? 您需要封装该数组在一个对象中,以防止变异但允许通过getter方法按索引访问。 - Dioxin
我的意思是数组组件是常量,即a [0]是一个常量变量,就像这样:public static final int SIZE = 10; - Athanasios V.
2
我不确定你的意思。你想给数组索引命名吗? - Dioxin
@Vince Emigh,你之前的回答对我很有意义。 - Athanasios V.
什么答案?我唯一的答案在下面,如果它解决了你的问题,你可以选择它作为采纳的答案 :) 除非你是指我的评论,在这种情况下,我的答案包括该信息(带有示例),你应该查看它。 - Dioxin
我认为Java中有不可变集合,但不幸的是没有数组。 - niceman
7个回答

18

如果想创建不可变数组,不行,Java中所有的数组都是可变的。

如果你只想在类中预定义数组,可以这样做:

private static final int[] MY_ARRAY = {10, 20, 30, 40, 50};

在这里,我们创建了一个长度为5的预定义数组MY_ARRAY,因此MY_ARRAY [0]10,以此类推。不过要注意,即使MY_ARRAY字段被声明为final,这并不意味着数组元素不能被更改。因此最好不要通过publicprotected修饰符将这样的数组暴露给公共。


2
不,这不是常量数组,而是一个恒定的数组。我的意思是数组的组成部分是常量,而不是数组本身。 - Athanasios V.
1
@AthanasiosV.,请再次阅读我回答的第一句话。 - Tagir Valeev
是的,您的陈述完全正确,对于我迅速的回复感到抱歉。 - Athanasios V.
4
除了长度为零的数组,它们是安全不可变的。 - Dave L.

4
如果您不想修改值,并且只想访问集合的成员而不需要随机访问,那么一个非常简单的解决方案是使用一个最终的不可变列表,而不是使用一个常量数组:
static final ImmutableList<Type> arrayOfConstants = ImmutableList.of(t1, t2, t3);

3

我的意思是数组组件应该是常量,例如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];
    }
}

如果您想要循环,我建议返回数组的深拷贝


1
问题不是“如何给数组索引命名”,而是“如何创建一个常量数组,这个东西展示了我所说的常量”。你的回答是“你不能做这个无关的事情,顺便提一下,你应该记住这个警告,它实际上是你问题的核心”。 - anon

1

如果在对象中使用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

如果想了解不可变数组,可以参考以下链接:

Java 中的不可变数组

有没有办法让 Java 中的普通数组变成不可变数组?


0

-如果你预先知道值,请初始化数组值,并将该数组标记为final

-如果一开始不知道值,则编写公共的getter/setter方法,将数组声明为private。在setter方法中编写逻辑以丢弃对特定元素所做的更改(或在对同一元素进行多次更改时抛出异常)


0

这篇文章已经开放了一段时间了。 我很惊讶,为什么没有人考虑过。

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


0

我看到了这篇文章,它让我想起了我为一个下棋应用程序所做的事情。

也许你只是想要一组常量,它们都是另一个常量的子级。我的意思是,如果你创建一个名为你的“数组”的最终类,并在其中描述几个常量,那么你就可以通过 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;
}

我不知道这是否是最好的方法,也不知道它是否是最糟糕的方法。但我认为它回答了你的问题并给出了解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接