2015-10-06 2 views
2

В C++ мы могли бы использовать макрос, какКак stringify в Java

#define check_and_log_warning(x) if (!(x)) {log_error(#x); cout<<__LINE__;} 

Я хочу, чтобы получить значение логического выражения, а также использовать его в качестве строки. Получение номера строки внутри макроса будет дополнительным преимуществом.

Может ли что-то вроде этого макроса быть написано на Java? Я недавно переехал из c/C++ в java, поэтому мне интересно, можно ли это сделать в C++ без макроса?

+1

привыкнуть к тому факту, что вы не можете делать много вещей, которые вы использовали в Java .. –

ответ

2

Препроцессор - это то, что я пропустил от C/C++ в Java. Есть способы ..., но они - пути Java.

1/Утверждения: http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html

2/Logs: Тот, который я использую https://commons.apache.org/proper/commons-logging/

(более LOG4J или что вы хотите)

Для печати номеров строк в логах, вы можете использовать что-то вроде: int lineNo = Thread.currentThread().getStackTrace()[2].getLineNumber();

Редактировать: Предупреждение: в отличие от __LINE__ на C++ получение трассировки стека приводит к штрафу за производительность. Be nice :)

+0

Только что обнаружено AssertionError может быть пойман. Но для предупреждений я думаю, что попробовать поймать с утверждением слишком много. –

+0

Нет, не делай этого. Утверждения разработаны определенным образом. –

2

В Java нет средства макросов.

Вы будете использовать фреймворк регистрации (из которого есть на что выбрать).

if (! theActualConditionNotJustX) myLogger.error("describe problem here"); 

Бэкэнд ведения журнала (если он сконфигурирован таким образом) обеспечивает сбор и отображение номеров строк. Для этого существует некоторая стоимость исполнения, но она обычно небрежна, особенно там, где задействованы фактические «ошибки» (она может стать немного дорогостоящей для ведения журнала трассировки).

+2

Это даже не позволяет удаленно ответить на вопрос, если и как 'log_error (#x);' и ' cout << __ LINE __; 'возможны на Java. – deviantfan

+0

Они невозможны на Java. У него просто нет макросистемы. Не стреляйте в посыльного ... – Thilo

+0

Не знаете, номер строки, но получение строки «true» или «false» из значения bool не должно быть проблемой? ОП знает, что макросов нет. – deviantfan