最终字符串的最终数组是否仍然可变?

Orc*_*rch 0 java arrays string final

假设我有一个数组

public static final String[] fooArray ={ Foo.a, Foo.b, Foo.c };
Run Code Online (Sandbox Code Playgroud)

其中Foo.ab和c是静态最终字符串.

我仍然可以做这样的事情fooArray[0] = "taco";,并最终{ taco, Foo.b, Foo.c }为fooArray的内容是什么?

如果是这样,是否会将数组设为私有,并使用getter来生成数组的副本以Arrays.copyOf解决此问题?

T.J*_*der 8

所述final适用于数组引用,而不是它的条目.仍然可以将不同的字符串写入其条目.

如果是这样,将数组设为私有,并使用Arrays.copyOf创建数组副本的getter解决此问题?

是的,防御性副本是处理这种情况的一种相当标准的方法.

或者,根据您所概述的内容,您根本不需要使用数组,只需要一个看起来像这样的getter:

public String[] getFooArray() {
    return new String[] { Foo.a, Foo.b, Foo.c };
}
Run Code Online (Sandbox Code Playgroud)

或者正如jtahlborn评论的那样,使用不可修改的List<String>:

public static final List<String> fooArray;
static {
    List<String> a = new ArrayList<>();
    Collections.addAll(a, Foo.a, Foo.b, Foo.c);
    fooArray = Collections.unmodifiableList(a);
}
// (There's probably some really nifty Java8 way to do that as a one-liner...
Run Code Online (Sandbox Code Playgroud)