Посмотрите нижнюю часть этого ответа для обновленного (2013) решение с помощью Гуавы.
Это - то, с чем я в конечном счете пошел. Оказалось, что у нас уже был служебный метод для пустого безопасного Сравнения строк, таким образом, простое решение состояло в том, чтобы использовать это. (Это - большая кодовая база; легкий пропустить такого рода вещь :)
public int compareTo(Metadata other) {
int result = StringUtils.compare(this.getName(), other.getName(), true);
if (result != 0) {
return result;
}
return StringUtils.compare(this.getValue(), other.getValue(), true);
}
Это - то, как помощник определяется (она перегружается так, чтобы можно было также определить, аннулирует ли, на первом месте или длятся, если Вы хотите):
public static int compare(String s1, String s2, boolean ignoreCase) { ... }
, Таким образом, это - по существу то же как [1 114] ответ Eddie (хотя я не назвал бы статический вспомогательный метод компаратор ), и тот из uzhin также.
Так или иначе, в целом, я сильно одобрил бы решение Patrick, поскольку я думаю, что это - хорошая практика для пользований созданными библиотеками, когда это возможно. ( Знают и пользуются библиотеками , как говорит Josh Bloch.), Но в этом случае который не привел бы к самому чистому, самому простому коду.
Наборов палаты общин На самом деле, вот способ сделать решение на основе Apache палатой общин NullComparator
более простой. Объедините его с нечувствительный к регистру Comparator
обеспеченный в String
класс:
public static final Comparator NULL_SAFE_COMPARATOR
= new NullComparator(String.CASE_INSENSITIVE_ORDER);
@Override
public int compareTo(Metadata other) {
int result = NULL_SAFE_COMPARATOR.compare(this.name, other.name);
if (result != 0) {
return result;
}
return NULL_SAFE_COMPARATOR.compare(this.value, other.value);
}
Теперь это довольно изящно, я думаю. (Всего одна маленькая проблема остается: палата общин NullComparator
не поддерживает дженериков, таким образом, существует присвоение непроверенное.)
Гуавы Почти 5 лет спустя, вот то, как я занялся бы своим исходным вопросом. При кодировании в Java я (конечно), использовал бы Гуава . (И вполне конечно не Apache палата общин.)
Помещенный эта константа где-нибудь, например, в классе "StringUtils":
public static final Ordering CASE_INSENSITIVE_NULL_SAFE_ORDER =
Ordering.from(String.CASE_INSENSITIVE_ORDER).nullsLast(); // or nullsFirst()
Затем в public class Metadata implements Comparable
:
@Override
public int compareTo(Metadata other) {
int result = CASE_INSENSITIVE_NULL_SAFE_ORDER.compare(this.name, other.name);
if (result != 0) {
return result;
}
return CASE_INSENSITIVE_NULL_SAFE_ORDER.compare(this.value, other.value);
}
, Конечно, это почти идентично Apache версия палаты общин (оба использования JDK CASE_INSENSITIVE_ORDER), использование [1 110] являющийся единственной Определенной для гуавы вещью. Эта версия предпочтительна просто, потому что Гуава предпочтительна, как зависимость, к Наборам палаты общин. (Как [1 121] все соглашаются .)
, Если Вы задавались вопросом приблизительно [1 122] Ordering
, обратите внимание, что это реализует Comparator
. Это довольно удобно специально для более сложных потребностей сортировки, позволяя Вам, например, объединить несколько Упорядочиваний в цепочку с помощью [1 113]. Читайте Упорядочивание, Объясненное для больше!
Я знаю, что на выходных было как минимум два сообщения в блоге - мой и Айенде .
Для большей части кода это следует рассматривать просто из любопытства. Я думаю, было бы злоупотреблением использовать это для внедрения зависимостей, когда установленные фреймворки IoC / DI могут выполнять эту работу намного лучше и так просто.
В частности, этот подход опирается на выход из §17.5, a Специфичное для Microsoft расширение спецификации ... вы хотите, чтобы ваш код работал в Mono? Я не пробовал, но нет конкретной причины , по которой он должен компилироваться под gmcs / dmcs.
У Джона был лучший пример его использования в конкретном коде - для намеренно издевался над COM, но это было сделано для игры с .NET 4.0 / dynamic
. Еще раз; это не относится к большинству "