[英]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.