сравнить, где в

#java #refactoring #code-duplication

#java #рефакторинг #дублирование кода

Вопрос:

Я ищу какую-нибудь библиотеку со статическими функциями, чтобы устранить дублирование в коде, которые сравнивают «вещи».

 (evil.equals(s1) || evil.equals(s2) || evil.equals(s3))
(evil == enum1 || evil == enum2 || evil == enum3)
  

Ответ №1:

Вы могли бы сделать что-то вроде

 Arrays.asList(s1, s2, s3).contains(evil)
  

Это было бы немного короче

Комментарии:

1. Короче, но дороже. Что делает ваш код, так это создает массив и выполняет итерации по нему.

Ответ №2:

Как насчет этого для начала:

 boolean equalsAny(Object object, Object... others) {
    for (Object other : others) {
        if (other.equals(object))
            return true;
    }
    return false;
}

Object evil = ...;
SpecialClass special = ...;
AnotherClass another = ...;
if (equalsAny(evil, "aString", special, Integer.valueOf(42), another)) {
    // match found!
}
  

Комментарии:

1. @PeterLawrey: Да? Что вы имеете в виду?

2. Object... является массивом. Если бы вы сохранили это, у вас был бы новый объект. Однако с помощью Escape-анализа JVM может определить, что этот объект используется только в этом методе, и выделить его в стеке (или полностью удалить)

3. @PeterLawrey: Ооо, Я понимаю, о чем ты говоришь — анализ Escape — это то, что JVM использует для оптимизации этого метода. Никогда не слышал об этом раньше; очень круто! Спасибо!

4. Найдите -XX: DoEscapeAnalysis который включен по умолчанию из Java 6, обновление 19.

5. Проверка, у меня есть основная идея, как писать такие функции (но я ленив)… То, что я искал, — это некоторая «стандартная» библиотека, которая имеет перегруженные методы и также может сравнивать перечисления. И, конечно, объекты того же типа.

Ответ №3:

Для второй строки неплохо подошел бы оператор switch:

 switch (evil) {
   case enum1:
   case enum2:
   case enum3:
      //code
      break;
}
  

Ответ №4:

Я не знаю специальной библиотеки, но если вас не волнует производительность, следующее должно работать из коробки:

 Arrays.asList(s1, s2, s3).contains(evil);
  

Простая реализация без накладных расходов на создание списка может быть чем-то вроде:

 public static boolean equalsAny(Object obj, Object ... others) {
    for (Object other: others) {
        if (obj.equals(other))
            return true;
    }

    return false;
}