Sto implementando un compareTo()
metodo per una classe semplice come questa (per poter usare Collections.sort()
e altri gadget offerti dalla piattaforma Java):
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
Voglio che l' ordine naturale per questi oggetti sia: 1) ordinati per nome e 2) ordinati per valore se il nome è lo stesso; entrambi i confronti dovrebbero essere case-sensitive. Per entrambi i campi i valori null sono perfettamente accettabili, quindi compareTo
in questi casi non devono rompersi.
La soluzione che mi viene in mente è in linea con quanto segue (sto usando "clausole di guardia" qui mentre altri potrebbero preferire un singolo punto di ritorno, ma questo è accanto al punto):
// primarily by name, secondarily by value; null-safe; case-insensitive
public int compareTo(Metadata other) {
if (this.name == null && other.name != null){
return -1;
}
else if (this.name != null && other.name == null){
return 1;
}
else if (this.name != null && other.name != null) {
int result = this.name.compareToIgnoreCase(other.name);
if (result != 0){
return result;
}
}
if (this.value == null) {
return other.value == null ? 0 : -1;
}
if (other.value == null){
return 1;
}
return this.value.compareToIgnoreCase(other.value);
}
Questo fa il lavoro, ma non sono perfettamente soddisfatto di questo codice. Certo, non è molto complesso, ma è piuttosto prolisso e noioso.
La domanda è: come lo renderesti meno prolisso (pur mantenendo la funzionalità)? Sentiti libero di fare riferimento alle librerie standard Java o Apache Commons se ti aiutano. L'unica opzione per rendere questo (un po ') più semplice sarebbe implementare il mio "NullSafeStringComparator" e applicarlo per confrontare entrambi i campi?
Modifiche 1-3 : Eddie ha ragione; risolto il caso "entrambi i nomi sono null" sopra
Informazioni sulla risposta accettata
Ho fatto questa domanda nel 2009, ovviamente su Java 1.6, e all'epoca la soluzione JDK pura di Eddie era la mia risposta preferita accettata. Non ho mai avuto modo di cambiarlo fino ad ora (2017).
Ci sono anche soluzioni per biblioteche di terze parti - una Apache Commons Collections del 2009 e una Guava del 2013, entrambe pubblicate da me - che preferivo ad un certo punto nel tempo.
Ora ho reso la soluzione Java 8 pulita di Lukasz Wiktor la risposta accettata. Questo dovrebbe sicuramente essere preferito se su Java 8, e in questi giorni Java 8 dovrebbe essere disponibile per quasi tutti i progetti.