2015-12-29 12 views
5

Während eine kleine API entwerfen, ich war über einen statischen Wert zu schreiben, dass Verweise auf ein Array von String: public static final String[] KEYS={"a","b","c"} ich gefunden habe, dies als eine ‚Sicherheitslücke‘ gekennzeichnet wird in Joshua Bloch ‚Effective Java‘ Punkt 14, wo er als Alternative vorgeschlagen, erklärt te Array ‚private‘ und ein öffentliches Getter schaffen, die eine unveränderbare Liste zurückzugibt:ein public static final Array Modifizieren

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

ich kann einfach nicht verstehen, warum würde dies erforderlich sein, wobei die Anordnung in der ursprünglichen Anweisung wird als final deklariert, obwohl ihre public und ihre Elemente unveränderlich sind, wie könnte das von einem externen Code geändert werden?

Antwort

8

Das Array nicht unveränderlich ist.

können Sie noch schreiben:

KEYS[0] = "d"; 

ohne Probleme. final nur bedeutet, dass Sie nicht schreiben können:

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

D.h. Sie können der Variablen KEYS keinen neuen Wert zuweisen.

+1

Upvoted für die Erklärung 'final', scheint wie eine Menge Leute dieses Schlüsselwort nicht verstehen. – Manu

4

letzte bedeutet

Sie nicht den Korb ändern können. Noch können Sie die Früchte innen ändern.

Basket ist Ihre Array-Instanz. Früchte sind deine Schlüssel im Inneren.

Im ersten Fall von irgendwo anders in dem Code, kann ich

ClassName.KEYS[2] ="MyOwnValue"; 

tun, aber Sie können nicht ändern, wenn es als nicht änderbar Liste.

Geben Sie einen Schuss zu lesen: Why final instance class variable in Java?

+0

Schöne Analogie, ich liebe es :) –

0

Während der Array-Referenz selbst ist unveränderlich (Sie es mit einem Verweis auf ein anderes Array nicht ersetzen kann) und die Saiten selbst sind auch unveränderlich ist es immer noch möglich

KEYS[0] = "new Key"; 
0

Ein zusammengesetztes Objekt (Array zu schreiben, Set , List etc.) final bedeutet nicht, dass seine konstituierenden Objekte nicht geändert werden - Sie können konstituierende Objekte noch ändern. final für ein zusammengesetztes Objekt bedeutet einfach, dass seine Referenz nicht geändert werden kann.

Für Ihren Fall kann der Wert KEYS nicht geändert werden, aber KEYS[0] usw. kann geändert werden.