“Newing” Интерфейсы

Посмотрите нижнюю часть этого ответа для обновленного (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.), Но в этом случае который не привел бы к самому чистому, самому простому коду.

Редактирование (2009): Apache версия

Наборов палаты общин На самом деле, вот способ сделать решение на основе 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 не поддерживает дженериков, таким образом, существует присвоение непроверенное.)

Обновление (2013): версия

Гуавы Почти 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]. Читайте Упорядочивание, Объясненное для больше!

7
задан Alfred Myers 20 August 2009 в 02:56
поделиться

1 ответ

Я знаю, что на выходных было как минимум два сообщения в блоге - мой и Айенде .

Для большей части кода это следует рассматривать просто из любопытства. Я думаю, было бы злоупотреблением использовать это для внедрения зависимостей, когда установленные фреймворки IoC / DI могут выполнять эту работу намного лучше и так просто.

В частности, этот подход опирается на выход из §17.5, a Специфичное для Microsoft расширение спецификации ... вы хотите, чтобы ваш код работал в Mono? Я не пробовал, но нет конкретной причины , по которой он должен компилироваться под gmcs / dmcs.

У Джона был лучший пример его использования в конкретном коде - для намеренно издевался над COM, но это было сделано для игры с .NET 4.0 / dynamic . Еще раз; это не относится к большинству "

10
ответ дан 7 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: