[英]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
的复合对象(数组, Set
, List
等)并不意味着它的组成对象不会被更改 - 您仍然可以更改组成对象。 复合对象的final
意味着它的引用不能改变。
对于你的情况,价值KEYS
不能改变,但KEYS[0]
等是可以改变的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.