Как исключить некоторые операторы System.out / logging при выполнении кода Java? - PullRequest
1 голос
/ 15 мая 2010

В C ++, если мы не хотим, чтобы некоторые операторы компилировались в код, который поставляется как вызовы функций assert, мы контролируем их компиляцию с помощью директив препроцессора #ifndef.

Как нам это сделать на Java?

У меня есть несколько операторов System.out.println () для отладки, которые я хотел бы удалить для окончательного кода.

Одним из способов является их условное выполнение под воздействием логической переменной. Есть ли лучший способ сделать это?

Поскольку у меня есть Java-приложение Swing, я могу отключить операторы System.out.println, не влияя на вывод. Какой способ это сделать?

Ответы [ 5 ]

6 голосов
/ 15 мая 2010

Используйте каркас ведения журнала, например slf4j . Вы можете печатать на консоли в режиме отладки и пропустить все в работе без перекомпиляции приложения.

4 голосов
/ 15 мая 2010

Использовать ведение журнала. См log4j или регистрация общего достояния.

Как правило, каждая запись в журнале имеет уровень серьезности (например, отладка, информация, предупреждение, ошибка), и вы можете настроить печать из приложения. Вы можете распечатать все из них для отладки, но только некоторые (например, информация и выше) в производстве. Конфигурация обычно выполняется с помощью одного простого текстового файла.

Каркасы ведения журналов могут делать больше, чем просто: автоматически добавлять больше деталей (например, метка времени или идентификатор потока), вести журнал в консоли, файл и / или базу данных, вращать файлы и многое другое.

3 голосов
/ 15 мая 2010

Используйте AspectJ для тех фрагментов кода, которые вы хотите добавить или удалить во время компиляции и компилировать без AspectJ, когда вы не хотите их использовать.

0 голосов
/ 16 мая 2010

Для того, что вы делаете, утверждения могут быть подходящим способом. Ключевое слово assert было добавлено в Java в версии 1.4 и концептуально похоже на assert() в C ++, с которым, как я вижу, вы знакомы.

assert операторы в Java ничего не делают, если они оцениваются как true и кричат ​​на вас в противном случае, что идеально подходит для отладки. Они также не работают по умолчанию, что означает, что компилятор будет игнорировать их, если вы явно не скажете этого не делать. Конечным результатом является инструмент отладки, который «испаряется», когда вы отправляете свой производственный код.

Вот учебник Sun по Java assert s .

0 голосов
/ 15 мая 2010

В общем (не только для вашего примера) вы можете создать несколько реализаций интерфейса и изменить, какой экземпляр используется во время выполнения. Это называется полиморфизм , преимущество перед if / else: вы выбираете реализацию один раз , а не каждый раз, когда она используется.

В Java полиморфизм не приводит к снижению производительности.

public interface MyInterface {
  void trashTheCPU();
}

public class MyRealImpl implements MyInterface {
  @Override
  public void trashTheCPU() {
    // actually trash the CPU with heavy tasks
  }
}

public class MyEmptyImpl implements MyInterface {
  @Override
  public void trashTheCPU() {
    // do nothing
  }
}

// ... somewhere else:

MyInterface mi = null;

public void initEveryting() {
  if(trashTheCPUconditionIsMet) {
    mi = new MyRealImpl();
  } else {
    mi = new MyEmptyImpl();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...