Найти все способы использования метода toString()
У меня есть огромный проект с классом, который широко используется везде внутри этого проекта. Этот класс определяет метод toString()
, который выводит много информации. Я хочу определить другой метод, скажем, toShortString()
и заменить все вхождения, где с этим вызовом метода вызывается оригинальный toString()
.
Проблема заключается в том, что существует много кода, который выглядит следующим образом:
log.debug("Order issued: " + order);
log.debug("Loaded list of orders: " + orders);
где order
- экземпляр этого объекта, а orders
- список таких объектов.
Есть ли способ найти все такие вхождения?
Любые предложения приветствуются. IDE - это идея IntelliJ, если это имеет значение.
Ответы
Ответ 1
Просто переопределите тело метода toString()
в классе Order
.
Технически невозможно найти все вызовы, потому что даже системные библиотеки во многих местах называют toString()
, как и все типы коллекций. Также вы должны обратить внимание на свои шаблоны (независимо от того, какой графический интерфейс вы используете.)
Итак, вы хотите зарегистрировать короткую распечатку и отладить полный (оригинал). Оба вызова toString()
. Затем вы можете попытаться заглянуть внутрь трассировки стека вызовов, чтобы решить, откуда он вызван. Используйте Thread.currentThread().getStackTrace()
для доступа к текущей трассировке стека.
Скажем, если какой-либо из последних 10 элементов stacktrace принадлежит вам классу Log
, он вызывается для ведения журнала, затем вы можете распечатать короткую распечатку. В противном случае выполните полную распечатку.
Да, хорошей практикой является перенос различных версий toString()
в отдельные методы.
Ответ 2
Вместо замены всех вхождений toString()
, которые были бы подвержены ошибкам (вы наверняка пропустили бы некоторые), а некоторые действительно трудно заменить (например, объекты System.out.println()
на List
объектов Order
всегда вызывать только toString()
) Я предлагаю вам изменить сам toString()
на вызов toShortString()
.
Переместите весь код внутри toString()
в другую функцию с именем toLongString()
, а затем используйте эту функцию, если вам нужно иметь подробное представление String
объектов Order
.
Ответ 3
Я знаю, что немного опоздал, но я нашел законный способ сделать это в IDEA:
- Внутри класса mark
toString
метод как @Deprecated
.
-
Analyze
→ Run inspection by name
→ выберите Deprecated API usage
.
Viola! Он перечислит все применения любых устаревших API (надеюсь, вы этого не сделаете), который, конечно, включает в себя toString
, который вы просто аннотировали. Не забудьте удалить аннотацию.
P.S. не будут отображаться неявные вызовы, хотя