Если у Вас, оказывается, есть некоторые игры MS-DOS прежней версии вокруг, это могло бы быть полезно;-)
Я бы не стал писать какие-то причудливые методы для вывода отладочной информации. Просто используйте либо LOG.debug (...)
, если вы используете регистратор, либо System.err.println (...)
в противном случае.
Вы можете пожелать используйте String.format ("var =% s val =% s", "VarName", val)
вместо объединения строк.
Убедитесь, что вы переопределили toString
в каждом из ваших классов, чтобы предоставить значимую информацию об отладке.
В конце концов, часто проще запустить отладчик и посмотреть, что происходит, вместо того, чтобы отслеживать множество записанных в журнал строк отладки.
Единственный раз, когда я
Взгляните на Simple Logging Framework , он позволяет вам вводить:
class Example {
static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(Example.class);
void doSomething(Object obj1, Object obj2) {
LOG.debug("This is object 1: {}, and this is object 2: {}", obj1, obj2);
}
}
Я думаю, что System.err.format - это то, что вам нужно:
System.err.format("var: %s\n", var);
- это сокращение для:
System.err.println(String.format("var: %s", var));
Лично я не предлагаю где-либо использовать операторы sysout. Вы всегда должны использовать отладчик (используя некоторую IDE). Я не могу представить, где это было бы нежелательно.
В противном случае я предлагаю фреймворки журналирования, такие как log4j, но опять же, это уже становится более сложным, когда я снова переключился бы на настоящую IDE с отладчиком.
Некоторые мысли:
Я бы реализовал toString ()
для интересующих объектов и таким образом распечатал бы члены в дружественном стиле (например, преобразовать отметки времени в читаемый формат и т. д.). Обычно я выбираю такой формат:
Объект [member1 =, member2 = ...]
В противном случае печать одного объекта даст вам имя класса плюс хэш-код идентификации, и (как вы обнаружили) это не очень полезно!
Commons имеет возможность делать это автоматически . Но вот простой toString ()
учебник , который я считаю более подходящим.
Существуют фреймворки журналирования, которые могут вас заинтересовать в будущем. например, посмотрите Log4j . На данный момент, однако, я бы не стал беспокоиться об этом.
Это натянуто, но ...
Вы получаете совет использовать IDE вместо простого текстового редактора. Я бы согласился с этим, на 100%.
Вы получаете совет использовать фреймворк регистрации или отладчик вместо вызовов println (). Ну, конечно, но ...
Еще лучше юнит-тесты. Не спрашивайте, что это - скажите, что вы ожидаете. Затем интегрированная среда модульного тестирования (обычно junit) проверит, что вы получаете то, что ожидаете. Чем больше я использую модульные тесты, тем меньше мне нужна отладка и тем меньше мне нужны println. И когда что-то меняется, среда тестирования говорит мне - мне не нужно вручную повторно оценивать результаты каждого теста, просто наблюдайте за полосой.
Модульные тесты лучше, чем отладка, лучше, чем ведение журнала. Они не являются 100% заменой для отладки и ведения журнала, но начните их использовать, и вы обнаружите гораздо меньше необходимости в этих утомительных действиях.
Вы можете получить доступ к именам переменных с помощью АОП и переплетения во время компиляции. Самое приятное в этом заключается в том, что, если вы не выполняете переплетение, вы не добавляете код ведения журнала отладки, и в результате ваш исполняемый код становится более компактным и быстрым.
Вот пример использования AspectJ для создания исключения когда для поля установлено значение NULL. Обратите внимание на использование « joinPoint.getSignature ()
» для получения доступа к метаданным кода.
@Aspect
public class NotNullValidator {
@Pointcut(value = "set(@com.acme.NotNull * *.*) && args(valueBeingSet)")
private void setOfNonNullField(final Object valueBeingSet) { }
@Before(value = "setOfNonNullField(valueBeingSet)")
public void validate(final JoinPoint joinPoint, final Object valueBeingSet) {
if (valueBeingSet == null) {
throw new NullPointerException("Cannot set " + joinPoint.getSignature().getName() + " to null.");
}
}
}
См. Javadoc JoinPoint , чтобы узнать, что еще вы можете получить (номера строк, исходные и целевые объекты и т. Д.).