Rückgabe einer Referenz auf ein veränderliches Objekt gespeicherten Wert in einer der Objekt-Felder legt die interne Darstellung des Objekts
Ich bin immer diese Fehlermeldung bei der Ausführung von checkstyle auf meinen code auf die folgenden Zeilen:
@Override
public String[] getDescriptions() {
return DESCRIPTIONS;
}
aber BESCHREIBUNGEN IS NOT
verändert werden. Es ist definiert als:
private static final String[] DESCRIPTIONS = new String[NUM_COLUMNS];
static {
//In a loop assign values to the array.
for (int i = 0; i < NUM_COLUMNS; ++i) {
DESCRIPTIONS[i] = "Some value";
}
}
Dies ist die komplette Fehlermeldung:
"Returning a reference to a mutable object value stored in one
of the object's fields exposes the internal representation of
the object. If instances are accessed by untrusted code, and
unchecked changes to the mutable object would compromise security
or other important properties, you will need to do something
different. Returning a new copy of the object is better approach
in many situations."
Verwandte Frage: Link
- Die Objekte, die sich in BESCHREIBUNGEN sind veränderlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arrays und einige Sammlungen sind nicht unveränderlich in dem Sinne, dass Ihre Inhalte immer noch bleibt veränderlich.
Unveränderlichkeit in Java betrifft nur die Objekt-Referenz Belegung nicht seinen tiefen Inhalt.
Versuchen Sie dies:
BTW, Vorsicht java naming convention.. :
descriptions
, nichtDESCRIPTIONS
final
) würde verwirren mich. Die folgende Antwort erklärt, warum und ich bin völlig einverstanden: stackoverflow.com/a/18641425/985949Foo * const
äquivalent in C++, aber nichtconst Foo *
. Wenn wir aber den Blick in die semantische Bedeutung des OP, wenn er erwischt zu haben, dass das array als Konstante und nicht-ändern (obwohl sprachlich ist es nicht beschützt zu haben), ich finde es immer noch OK ist ALL_CAPITAL_UNDERSCORE_SEPARATED übereinkommen (Obwohl ich denke, dass die änderung zu einer unveränderlichen Liste wird eine viel sicherere Wahl).Die Referenz-variable ist
final
so kann man nicht zuordnen, ein anderes array zuDESCRIPTIONS
. Jedoch, das Objekt selbst verändert (arrays sind immer veränderlich),final
oder nicht. Wenn Sie die Rückgabe der Referenz, dann verlieren Sie die Kontrolle über die Inhalte Ihrer Variablen, die Verletzung der Kapselung.Müssten Sie entweder die Rückgabe einer Kopie des Arrays, oder nicht Rückgabe des Arrays, an alle, die Bereitstellung einer Methode, um ein bestimmtes array-element statt, wenn das gut genug.