Test90 ha scritto:
ho problemi con Sonar, mi chiede di clonare una lista poiché la segnala come vulnerabilità.
Premetto intanto che gli avvertimenti di SonarQube li ritengo in certa parte da prendere molto con "le pinze". Lo usano anche sui progetti su cui lavoro. Avevo scritto una
enum che ha degli attributi (final) quindi avevo dovuto scrivere un costruttore (che è
private per default) per inizializzare i campi. E Sonar mi dice "
Remove this unused private "xxx" constructor". NOO non posso toglierlo!!
Test90 ha scritto:
Di preciso mi segnala l'errore sul metodo getter del mio oggetto. Questo l'errore:
Instead use an unmodifiable Collection (via Collections.unmodifiableCollection, Collections.unmodifiableList, ...) or make a copy of the mutable object, and store or return the copy instead.
This rule checks that arrays, collections and Dates are not stored or returned directly.
Beh, è solo una questione di stile, insomma per "buona" programmazione non esporre dati "mutabili". Ma il problema non è tanto questo: dove vengono usati quei dati? A CHI/DOVE potrebbe fare danni? Se danni non ne fa o non ne può fare perché TU conosci i punti in cui viene usato quel dato e SAI che non c'è nulla che causa problemi .... allora è un non-problema.
Test90 ha scritto:
public void setMiaLista(List<String> miaLista) {
this.miaLista = miaLista.stream().collect(Collectors.toList());
}
In generale le collezioni fornite dai Collector predefiniti sono comunque "mutabili".
Da Java 10 c'è un nuovo Collectors.
toUnmodifiableList() (avrebbero potuto aggiungerlo già da Java 8 ...)
Test90 ha scritto:
Soluzione adeguata al problema? Controindicazioni? O devo fare diversamente? Da notare che l'errore me lo segnala sul return del getter.
Banalmente: clonare la lista (le stringhe sono immutabili quindi NON è un problema se vengono condivise) ... oppure restituire la lista incapsulata in un "unmodifiable" list (il wrapper tramite Collection
s)