簡體   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