2017-01-12 3 views
0

Ich habe eine MembervariableWie auf arrylist in Java tiefe Kopie auszuführen

private ArrayList<CalendarableItem>[] resourceColumns = null; 

und Getter für die gleiche

public ArrayList<CalendarableItem>[] getResourceColumns() 
{ 
    return resourceColumns; 
} 

I findbugs für über Getter-Methode sehe. Malicious Code Verwundbarkeit: EI: Methode Rückkehr Array kann interne Darstellung aussetzen

Ich fand, dass ich eine tiefe Kopie von Array-Objekt zu tun haben, um diesen Fehler zu entfernen Malicious code vulnerability - May expose internal representation by incorporating reference to mutable object

Ich möchte nicht wegen Klon dieses Objekts zu tun zum Leistungsproblem. Haben wir eine andere bessere Lösung?

+1

Beachten Sie, dass Arrays und Generika unbehaglich bedfellows sind. Sie sollten stattdessen eine 'List >' verwenden. –

Antwort

0

Wenn die Liste unveränderlich sein soll, entfernen Sie den Getter. Dieser Getter, der die Liste zurückgibt, gibt die Möglichkeit, irgendwelche Elemente darin zu entfernen, hinzuzufügen, ....

Sie könnten stattdessen etwas ähnliches zu einem Adapter verwenden, um nur den gewünschten Zugriff zu geben. Wie ein bestimmter Getter oder die Größe der Liste, aber ohne Zugriff auf die Liste.

private List<CalendarableItem> resourceColumns = new ArrayList<>(); 

public CalendarableItem getCalendarableItem(int index){ 
    return resourceColumns.get(index); 
} 

public int getSize(){ return resourceColumns.size(); } 

Ihre Liste wird privat und unveränderlich (für den Moment) sein. Der einzige mögliche Zugang sind diejenigen, die Sie in Ihrer Klasse anpassen.

Wenn Sie verhindern möchten, dass die Instanz aktualisiert wird, können Sie auch eine Kopie davon zurückgeben, da die Instanzrückgabe momentan aus der Liste stammt (gleiche Referenz).

EDIT: Ich habe gerade bemerkt, dass dies ein Array ArrayList war, also ist dieses Beispiel nicht so funktionell, es wurde für eine einfache ArrayList geschrieben. Sie müssen den Adapter je nach Bedarf aktualisieren.

0

Nur ein Vorschlag, statt ArrayList<CalendarableItem>[] der Verwendung sollten Sie use List<List<CalendarableItem>>

Nun zurück zu Ihrer Frage kommen, können Sie Klon von Array zurück, so dass bei einer evtl. Änderungen Array macht es nicht in Ihrer ursprünglichen Anordnung widerspiegelt .

public ArrayList<CalendarableItem>[] getResourceColumns() 
{ 
    return Arrays.copyOf(resourceColumns, resourceColumns.length); 
} 

Wenn Sie wollen/brauchen mehr Kontrolle dann statt Methode getResourceColumns() Sie verschiedene Methoden schreiben müssen zurückkehren Objekt an bestimmten Array-Index usw.

+0

Das sind seine Worte: _Ich möchte nicht klonen dieses Objekts wegen Leistungsproblem_ und dies führt keine tiefe Kopie, nur eine Kopie der Sammlung – AxelH

+0

Array und Liste sind veränderbare Objekte daher muss er mindestens Array zu klonen. ArrayList-Objekte bleiben unverändert. Klonen Array wird nicht so viel Speicher essen natürlich hängt es auch von Array-Länge. –

+0

Aber Ihr kopiertes Array enthält immer noch die gleiche Referenz (aka selbe Liste), so dass sein Test immer noch zurückgibt. _Methode, das Array zurückgibt, kann ** interne Repräsentation ** ergeben, denke ich. Ja, Sie werden verhindern, dass ein Entwickler eine Instanz im Array entfernt oder überschreibt, aber Sie werden die Liste trotzdem zurückgeben, so dass Sie sie bei Bedarf löschen können. Ich glaube OP möchte das verhindern, weil er von einer tiefen Kopie spricht – AxelH

Verwandte Themen