Je suis la mise en œuvre de compareTo()
méthode d'une classe simple comme ceci (pour être en mesure d'utiliser Collections.sort()
et autres goodies offerts par la plate-forme Java):
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
Je veux que l' ordre naturel pour ces objets: 1) triée par nom et 2) triées par valeur si le nom est le même; les deux comparaisons doivent être insensibles à la casse. Pour les deux domaines les valeurs null sont parfaitement acceptables, alors compareTo
ne doit pas casser dans ces cas.
La solution qui vient à l'esprit est le long de la lignes de la suite (je suis à l'aide de "garde des clauses" ici, tandis que d'autres préfèrent un seul point de retour, mais c'est à côté de la question):
// 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);
}
De ce fait le travail, mais je ne suis pas parfaitement heureux avec ce code. Certes, il n'est pas très complexe, mais elle est très longue et fastidieuse.
La question est, comment voulez-vous faire de cette moins verbeux (tout en gardant la fonctionnalité)? Se sentir libre de se référer à la norme Java bibliothèques ou Apache Commons, si elles aident. Serait la seule option pour faire de la (un peu) plus simple à mettre en place mes propres "NullSafeStringComparator", et de l'appliquer pour comparer les deux champs?
Modifications 1-3: Eddie droit; fixe la "les deux noms sont null" cas ci-dessus