2015-12-29 2 views
5

При проектировании небольшого API я собирался написать статическое значение, которое ссылается на массив String: public static final String[] KEYS={"a","b","c"} Я нашел, что это обозначено как «дыра безопасности» в Joshua Bloch's пункт «Effective Java» 14, где он предлагает в качестве альтернативы, объявить тэ массив «частный» и обеспечить общественный поглотитель, который возвращает неизменяемый список:Изменение публичного статического окончательного массива

return Collections.unmodifiableList(Arrays.asList(KEYS)) 

Я просто не могу понять, почему это было бы необходимо, массив в исходном заявлении объявляется окончательным, даже несмотря на то, что его публикация и ее элементы неизменяемы, как это можно изменить из внешней части кода?

ответ

8

Массив не является неизменным.

Вы все еще можете написать:

KEYS[0] = "d"; 

без каких-либо проблем. final просто означает, что вы не можете написать:

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

Т.е. вы не можете назначить новое значение переменной KEYS.

+1

Упрощенный для объяснения 'final', похоже, что многие люди не понимают этого ключевого слова. – Manu

4

окончательное означает

Вы не можете изменить корзины. Тем не менее вы можете изменить фрукты внутри.

Корзина является экземпляром вашего массива. Фрукты - ваши ключи внутри.

В первом случае, где-то еще в коде, я могу сделать

ClassName.KEYS[2] ="MyOwnValue"; 

Но вы не можете изменить, когда это неизменяемый список.

Дайте снимок следующим образом: Why final instance class variable in Java?

+0

Хорошая аналогия, мне это нравится :) –

0

В то время как ссылка на массив сам по себе является неизменным (вы не можете заменить его ссылкой на другой массив), а сами строки являются неизменяемыми тоже еще можно написать

KEYS[0] = "new Key"; 
0

Составной объект (массив, Set , List и т. Д.), Являющийся final, не означает, что его составные объекты не будут изменены - вы все равно можете изменить составные объекты. final для составного объекта просто означает, что его ссылка не может быть изменена.

Для вашего случая значение KEYS не может быть изменено, но KEYS[0] и т. Д. Можно изменить.

Смежные вопросы