Sto creando un'applicazione contenente una classe che sto scrivendo chiamata Persona. Uno dei campi di Person è "alias" che è un ArrayList<String>
. In definitiva gli alias verranno visualizzati all'utente secondo la seguente logica: Se la persona ha alias allora dovrebbero essere visualizzati come [Finch, Wren, Admin, etc...]
, altrimenti dovrebbe essere visualizzato UNKNOWN
. Finora ho provato l'attuazione del presente in uno dei tre modi:Come gestire il valore predefinito di ArrayList
persona contiene il metodo
getAliases()
che restituisce semplicemente una copia del ArrayList come è. Il chiamante controlla una matrice vuota per implementare il comportamento desiderato.La persona contiene il metodo
aliasesToString()
che può essere chiamato per produrre la stringa desiderata.Invece di utilizzare
ArrayList<String>
, l'alias è un'implementazione diDefaultableArrayList<T>
. Questa classe estende ArrayList e contiene un valore predefinito con tipo T. Il metodotoString()
viene sostituito per produrre la stringa desiderata. L'applicazione chiamasome_person.getAliases().toString()
per produrre il comportamento desiderato.
Qui di seguito è la mia realizzazione di opzione 3:
public class DefaultableArrayList<T> extends ArrayList<T> {
private static final long serialVersionUID = -6735356930885363889L; // Auto-generated
private final T defaultElement;
public DefaultableArrayList(T defaultElement) {
super();
this.defaultElement = defaultElement;
}
public DefaultableArrayList(Collection<? extends T> c, T defaultElement) {
super(c);
this.defaultElement = defaultElement;
}
public DefaultableArrayList(int initialCapacity, T defaultElement) {
super(initialCapacity);
this.defaultElement = defaultElement;
}
public T getDefaultElement() {
return defaultElement;
}
@Override
public String toString() {
if (!isEmpty()) {
return super.toString();
} else {
return defaultElement.toString();
}
}
}
Quello che mi preoccupa sulle opzioni 2 e 3 è che potrei aggiungere complessità inutile mentre violare le linee guida OOP. La persona dovrebbe davvero preoccuparsi di ciò che accade se non ci sono alias e ha senso che gli alias definiscano come è implementato in definitiva nell'applicazione? Penso che dovrei lasciare che il chiamante gestisca il caso vuoto. Quale opzione dovrei scegliere per soddisfare al meglio le linee guida di progettazione OOP standard? O c'è una quarta opzione che non ho considerato?
Preferirei restituire una vista immutabile: 'Collections.unmodifiableList (aliases)'. –
@JBNizet 'Collections.unmodifiableList (aliases)' è una buona alternativa. Protegge il membro dell'istanza originale da essere modificato e rende chiaro al chiamante del metodo che non possono mutare l'istanza Person mutando l'elenco degli alias. – Eran
Sì, certo, scusate non volevo implicare che avrei restituito un riferimento diretto. Era una svista. – Helios