繁体   English   中英

修改公共静态最终数组

[英]modifying a public static final array

在设计一个小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))

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

该数组不是不可变的。

你仍然可以写:

KEYS[0] = "d";

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

KEYS = new String[]{"d"};

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

最后的意思

你不能改变篮子。 你仍然可以改变里面的水果。

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

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

ClassName.KEYS[2] ="MyOwnValue";

但是当它是不可修改的列表时你无法修改。

请仔细阅读: 为什么Java中的最终实例类变量?

虽然数组引用本身是不可变的(你不能用对另一个数组的引用替换它)而且字符串本身也是不可变的,但它仍然可以写

KEYS[0] = "new Key";

final的复合对象(数组, SetList等)并不意味着它的组成对象不会被更改 - 您仍然可以更改组成对象。 复合对象的final意味着它的引用不能改变。

对于你的情况,价值KEYS不能改变,但KEYS[0]等是可以改变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM