修改公共静态最终数组

JBo*_*Boy 5 java arrays final

在设计一个小API的时候,我正准备编写一个引用String数组的静态值: public static final String[] KEYS={"a","b","c"} 我发现在Joshua Bloch的"Effective Java"第14项中将其标记为"安全漏洞",他建议将其作为替代方案,声明te array'private'并提供返回不可修改列表的公共getter:

return Collections.unmodifiableList(Arrays.asList(KEYS))
Run Code Online (Sandbox Code Playgroud)

我只是不明白为什么这是必要的,初始语句中的数组被声明为final,即使它是公共的,它的元素是不可变的,如何从外部代码修改?

hen*_*rik 8

该数组不是不可变的.

你仍然可以写:

KEYS[0] = "d";
Run Code Online (Sandbox Code Playgroud)

没有任何问题. final只是意味着你不能写:

KEYS = new String[]{"d"};
Run Code Online (Sandbox Code Playgroud)

即,您无法为变量分配新值KEYS.


Sur*_*tta 5

最终手段

您无法更改购物篮。不过你可以改变里面的水果。

Basket 是您的 Array 实例。水果是你内心的钥匙。

在第一种情况下,从代码中的其他地方,我可以这样做

ClassName.KEYS[2] ="MyOwnValue";
Run Code Online (Sandbox Code Playgroud)

但当它是不可修改列表时,您无法修改。

尝试阅读:为什么 Java 中的最终实例类变量?