#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;
}